001/*
002 * $Id: GenMatrixTest.java 5688 2017-01-03 08:45:09Z kredel $
003 */
004
005package edu.jas.vector;
006
007
008import java.util.ArrayList;
009import java.util.List;
010
011import junit.framework.Test;
012import junit.framework.TestCase;
013import junit.framework.TestSuite;
014
015import edu.jas.arith.BigRational;
016
017
018/**
019 * GenMatrix tests with JUnit
020 * @author Heinz Kredel
021 */
022
023public class GenMatrixTest extends TestCase {
024
025
026    /**
027     * main.
028     */
029    public static void main(String[] args) {
030        junit.textui.TestRunner.run(suite());
031    }
032
033
034    /**
035     * Constructs a <CODE>GenMatrixTest</CODE> object.
036     * @param name String.
037     */
038    public GenMatrixTest(String name) {
039        super(name);
040    }
041
042
043    /**
044     */
045    public static Test suite() {
046        TestSuite suite = new TestSuite(GenMatrixTest.class);
047        return suite;
048    }
049
050
051    int rl = 5;
052
053
054    int kl = 10;
055
056
057    int ll = 10;
058
059
060    float q = 0.5f;
061
062
063    int rows = 3+2;
064
065
066    int cols = 3+2;
067
068
069    @Override
070    protected void setUp() {
071    }
072
073
074    @Override
075    protected void tearDown() {
076    }
077
078
079    /**
080     * Test constructor and toString.
081     */
082    public void testConstruction() {
083        BigRational cfac = new BigRational(1);
084        GenMatrixRing<BigRational> mfac = new GenMatrixRing<BigRational>(cfac, rows, cols);
085
086        assertTrue("#rows = " + rows, mfac.rows == rows);
087        assertTrue("#columns = " + cols, mfac.cols == cols);
088        assertTrue("cfac == coFac ", cfac == mfac.coFac);
089
090        GenMatrix<BigRational> a;
091        a = mfac.getZERO();
092        //System.out.println("a = " + a);
093        assertTrue("isZERO( a )", a.isZERO());
094
095        GenMatrix<BigRational> b = new GenMatrix<BigRational>(mfac);
096        //System.out.println("b = " + b);
097        assertTrue("isZERO( b )", b.isZERO());
098
099        assertTrue("a == b ", a.equals(b));
100
101        GenMatrix<BigRational> c = b.copy();
102        //System.out.println("c = " + c);
103        assertTrue("isZERO( c )", c.isZERO());
104        assertTrue("a == c ", a.equals(c));
105
106        GenMatrix<BigRational> d = mfac.copy(b);
107        //System.out.println("d = " + d);
108        assertTrue("isZERO( d )", d.isZERO());
109        assertTrue("a == d ", a.equals(d));
110
111        a = mfac.getONE();
112        //System.out.println("a = " + a);
113        assertTrue("isONE( a )", a.isONE());
114
115        List<ArrayList<BigRational>> m = a.matrix;
116        List<List<BigRational>> ml = new ArrayList<List<BigRational>>(m.size());
117        for (ArrayList<BigRational> r : m) {
118            ml.add(r);
119        }
120        b = mfac.fromList(ml);
121        assertEquals("a == fromList(a.matrix)", a, b);
122
123        GenMatrix<BigRational> e = mfac.generate( (i,j) -> cfac.getZERO() );
124        //System.out.println("e = " + e);
125        assertTrue("e == 0: ", e.isZERO());
126
127        e = mfac.generate( (i,j) -> i == j ? cfac.getONE() : cfac.getZERO() );
128        //System.out.println("e = " + e);
129        assertTrue("e == 1: ", e.isONE());
130
131        e = mfac.generate( (i,j) -> i == j+1 ? cfac.getONE() : cfac.getZERO() );
132        //System.out.println("e = " + e);
133        assertTrue("e**"+mfac.cols+" == 0: ", e.power(mfac.cols).isZERO());
134    }
135
136
137    /**
138     * Test random matrix.
139     */
140    public void testRandom() {
141        BigRational cfac = new BigRational(1);
142        GenMatrixRing<BigRational> mfac = new GenMatrixRing<BigRational>(cfac, rows, cols);
143        GenMatrixRing<BigRational> tfac = mfac.transpose();
144
145        if (rows == cols) {
146            assertTrue(" mfac = tfac ", mfac.equals(tfac));
147        }
148
149        GenMatrix<BigRational> a, b, c;
150
151        for (int i = 0; i < 5; i++) {
152            a = mfac.random(kl, q);
153            //System.out.println("a = " + a);
154            if (a.isZERO()) {
155                continue;
156            }
157            assertTrue(" not isZERO( a" + i + " )", !a.isZERO());
158            b = a.transpose(tfac);
159            //System.out.println("b = " + b);
160            assertTrue(" not isZERO( b" + i + " )", !b.isZERO());
161            c = b.transpose(mfac);
162            //System.out.println("c = " + c);
163            assertEquals(" a^r^r == a ", a, c);
164        }
165    }
166
167
168    /**
169     * Test addition.
170     */
171    public void testAddition() {
172        BigRational cfac = new BigRational(1);
173        GenMatrixRing<BigRational> mfac = new GenMatrixRing<BigRational>(cfac, rows, cols);
174        GenMatrix<BigRational> a, b, c, d, e;
175
176        a = mfac.random(kl, q);
177        b = mfac.random(kl, q);
178        //System.out.println("a = " + a);
179        //System.out.println("b = " + b);
180
181        c = a.sum(b);
182        d = c.subtract(b);
183        //System.out.println("c = " + c);
184        //System.out.println("d = " + d);
185        assertEquals("a+b-b = a", a, d);
186
187        c = a.sum(b);
188        d = c.sum(b.negate());
189        //System.out.println("c = " + c);
190        //System.out.println("d = " + d);
191        assertEquals("a+b+(-b) = a", a, d);
192
193        c = a.sum(b);
194        d = b.sum(a);
195        //System.out.println("c = " + c);
196        //System.out.println("d = " + d);
197        assertEquals("a+b = b+a", c, d);
198
199        c = mfac.random(kl, q);
200        d = a.sum(b).sum(c);
201        e = a.sum(b.sum(c));
202        //System.out.println("d = " + d);
203        //System.out.println("e = " + e);
204        assertEquals("a+(b+c) = (a+b)+c", d, e);
205    }
206
207
208    /**
209     * Test scalar multiplication.
210     */
211    public void testScalarMultiplication() {
212        BigRational cfac = new BigRational(1);
213        GenMatrixRing<BigRational> mfac = new GenMatrixRing<BigRational>(cfac, rows, cols);
214        BigRational r, s, t;
215        GenMatrix<BigRational> a, b, c, d;
216
217        r = cfac.random(kl);
218        //System.out.println("r = " + r);
219        s = r.inverse();
220        //System.out.println("s = " + s);
221
222        a = mfac.random(kl, q);
223        //System.out.println("a = " + a);
224
225        c = a.scalarMultiply(r);
226        d = c.scalarMultiply(s);
227        //System.out.println("c = " + c);
228        //System.out.println("d = " + d);
229        assertEquals("a*b*(1/b) = a", a, d);
230
231        b = mfac.random(kl, q);
232        //System.out.println("b = " + b);
233
234        t = cfac.getONE();
235        //System.out.println("t = " + t);
236        c = a.linearCombination(b, t);
237        d = b.linearCombination(a, t);
238        //System.out.println("c = " + c);
239        //System.out.println("d = " + d);
240        assertEquals("a+1*b = b+1*a", c, d);
241
242        c = a.linearCombination(b, t);
243        d = a.sum(b);
244        //System.out.println("c = " + c);
245        //System.out.println("d = " + d);
246        assertEquals("a+1*b = b+1*a", c, d);
247
248        s = t.negate();
249        //System.out.println("s = " + s);
250        c = a.linearCombination(b, t);
251        d = c.linearCombination(b, s);
252        //System.out.println("c = " + c);
253        //System.out.println("d = " + d);
254        assertEquals("a+1*b+(-1)*b = a", a, d);
255
256        c = a.linearCombination(t, b, t);
257        d = c.linearCombination(t, b, s);
258        //System.out.println("c = " + c);
259        //System.out.println("d = " + d);
260        assertEquals("a*1+b*1+b*(-1) = a", a, d);
261
262        t = cfac.getZERO();
263        //System.out.println("t = " + t);
264        c = a.linearCombination(b, t);
265        //System.out.println("c = " + c);
266        assertEquals("a+0*b = a", a, c);
267
268        d = a.linearCombination(t, b, t);
269        //System.out.println("d = " + d);
270        assertEquals("0*a+0*b = 0", mfac.getZERO(), d);
271    }
272
273
274    /**
275     * Test (simple) multiplication.
276     */
277    public void testSimpleMultiplication() {
278        BigRational cfac = new BigRational(1);
279        GenMatrixRing<BigRational> mfac = new GenMatrixRing<BigRational>(cfac, rows, cols);
280        GenMatrix<BigRational> a, b, c, d, e, f;
281
282        a = mfac.getZERO();
283        b = mfac.getZERO();
284        c = a.multiplySimple(b);
285        //System.out.println("a = " + a);
286        //System.out.println("b = " + b);
287        //System.out.println("c = " + c);
288        assertTrue("0*0 = 0 ", c.isZERO());
289
290        a = mfac.getONE();
291        b = mfac.getONE();
292        c = a.multiplySimple(b);
293        //System.out.println("a = " + a);
294        //System.out.println("b = " + b);
295        //System.out.println("c = " + c);
296        assertTrue("1*1 = 1 ", c.isONE());
297
298        a = mfac.random(kl, q);
299        b = mfac.getONE();
300        c = a.multiplySimple(b);
301        d = a.multiply(b);
302        //System.out.println("a = " + a);
303        //System.out.println("b = " + b);
304        //System.out.println("c = " + c);
305        //System.out.println("d = " + d);
306        assertEquals("a*1 = a ", a, c);
307        assertEquals("a*1 = a*1 ", c, d);
308
309        c = b.multiplySimple(a);
310        d = a.multiply(b);
311        //System.out.println("a = " + a);
312        //System.out.println("b = " + b);
313        //System.out.println("c = " + c);
314        //System.out.println("d = " + d);
315        assertEquals("1*a = a ", a, c);
316        assertEquals("a*1 = a*1 ", c, d);
317
318        b = mfac.random(kl, q);
319        long s, t;
320        s = System.currentTimeMillis();
321        c = a.multiplySimple(b);
322        s = System.currentTimeMillis() - s;
323        assertTrue("nonsense " + s, s >= 0L);
324        d = b.multiplySimple(a);
325        t = System.currentTimeMillis();
326        e = a.multiply(b);
327        t = System.currentTimeMillis() - t;
328        assertTrue("nonsense " + t, t >= 0L);
329        f = b.multiply(a);
330        //System.out.println("a = " + a);
331        //System.out.println("b = " + b);
332        //System.out.println("c = " + c);
333        //System.out.println("d = " + d);
334        //System.out.println("e = " + e);
335        //System.out.println("f = " + e);
336        //System.out.println("e = " + e);
337        assertTrue("a*b != b*a ", !c.equals(d));
338        assertEquals("a*1 = a*1 ", c, e);
339        assertEquals("a*1 = a*1 ", d, f);
340        //System.out.println("time: s = " + s + ", t = " + t);
341
342        if (!mfac.isAssociative()) {
343            return;
344        }
345        c = mfac.random(kl, q);
346
347        d = a.multiply(b.sum(c));
348        e = (a.multiply(b)).sum(a.multiply(c));
349        assertEquals("a*(b+c) = a*b+a*c", d, e);
350
351        d = a.multiply(b.multiply(c));
352        e = (a.multiply(b)).multiply(c);
353        assertEquals("a*(b*c) = (a*b)*c", d, e);
354    }
355
356
357    /**
358     * Test parse matrix.
359     */
360    public void testParse() {
361        BigRational cfac = new BigRational(1);
362        GenMatrixRing<BigRational> mfac = new GenMatrixRing<BigRational>(cfac, rows, cols);
363
364        GenMatrix<BigRational> a, c;
365
366        a = mfac.random(kl, q);
367        //System.out.println("a = " + a);
368        if (!a.isZERO()) {
369            //return;
370            assertTrue(" not isZERO( a )", !a.isZERO());
371        }
372        String s = a.toString();
373        //System.out.println("s = " + s);
374        c = mfac.parse(s);
375        //System.out.println("c = " + c);
376        assertEquals("parse(toStirng(a) == a ", a, c);
377    }
378
379}