001/*
002 * $Id: GenMatrixTest.java 4125 2012-08-19 19:05:22Z 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;
064
065
066    int cols = 3;
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
124
125    /**
126     * Test random matrix.
127     */
128    public void testRandom() {
129        BigRational cfac = new BigRational(1);
130        GenMatrixRing<BigRational> mfac = new GenMatrixRing<BigRational>(cfac, rows, cols);
131        GenMatrixRing<BigRational> tfac = mfac.transpose();
132
133        if (rows == cols) {
134            assertTrue(" mfac = tfac ", mfac.equals(tfac));
135        }
136
137        GenMatrix<BigRational> a, b, c;
138
139        for (int i = 0; i < 5; i++) {
140            a = mfac.random(kl, q);
141            //System.out.println("a = " + a);
142            if (a.isZERO()) {
143                continue;
144            }
145            assertTrue(" not isZERO( a" + i + " )", !a.isZERO());
146            b = a.transpose(tfac);
147            //System.out.println("b = " + b);
148            assertTrue(" not isZERO( b" + i + " )", !b.isZERO());
149            c = b.transpose(mfac);
150            //System.out.println("c = " + c);
151            assertEquals(" a^r^r == a ", a, c);
152        }
153    }
154
155
156    /**
157     * Test addition.
158     */
159    public void testAddition() {
160        BigRational cfac = new BigRational(1);
161        GenMatrixRing<BigRational> mfac = new GenMatrixRing<BigRational>(cfac, rows, cols);
162        GenMatrix<BigRational> a, b, c, d, e;
163
164        a = mfac.random(kl, q);
165        b = mfac.random(kl, q);
166        //System.out.println("a = " + a);
167        //System.out.println("b = " + b);
168
169        c = a.sum(b);
170        d = c.subtract(b);
171        //System.out.println("c = " + c);
172        //System.out.println("d = " + d);
173        assertEquals("a+b-b = a", a, d);
174
175        c = a.sum(b);
176        d = c.sum(b.negate());
177        //System.out.println("c = " + c);
178        //System.out.println("d = " + d);
179        assertEquals("a+b+(-b) = a", a, d);
180
181        c = a.sum(b);
182        d = b.sum(a);
183        //System.out.println("c = " + c);
184        //System.out.println("d = " + d);
185        assertEquals("a+b = b+a", c, d);
186
187        c = mfac.random(kl, q);
188        d = a.sum(b).sum(c);
189        e = a.sum(b.sum(c));
190        //System.out.println("d = " + d);
191        //System.out.println("e = " + e);
192        assertEquals("a+(b+c) = (a+b)+c", d, e);
193    }
194
195
196    /**
197     * Test scalar multiplication.
198     */
199    public void testScalarMultiplication() {
200        BigRational cfac = new BigRational(1);
201        GenMatrixRing<BigRational> mfac = new GenMatrixRing<BigRational>(cfac, rows, cols);
202        BigRational r, s, t;
203        GenMatrix<BigRational> a, b, c, d;
204
205        r = cfac.random(kl);
206        //System.out.println("r = " + r);
207        s = r.inverse();
208        //System.out.println("s = " + s);
209
210        a = mfac.random(kl, q);
211        //System.out.println("a = " + a);
212
213        c = a.scalarMultiply(r);
214        d = c.scalarMultiply(s);
215        //System.out.println("c = " + c);
216        //System.out.println("d = " + d);
217        assertEquals("a*b*(1/b) = a", a, d);
218
219        b = mfac.random(kl, q);
220        //System.out.println("b = " + b);
221
222        t = cfac.getONE();
223        //System.out.println("t = " + t);
224        c = a.linearCombination(b, t);
225        d = b.linearCombination(a, t);
226        //System.out.println("c = " + c);
227        //System.out.println("d = " + d);
228        assertEquals("a+1*b = b+1*a", c, d);
229
230        c = a.linearCombination(b, t);
231        d = a.sum(b);
232        //System.out.println("c = " + c);
233        //System.out.println("d = " + d);
234        assertEquals("a+1*b = b+1*a", c, d);
235
236        s = t.negate();
237        //System.out.println("s = " + s);
238        c = a.linearCombination(b, t);
239        d = c.linearCombination(b, s);
240        //System.out.println("c = " + c);
241        //System.out.println("d = " + d);
242        assertEquals("a+1*b+(-1)*b = a", a, d);
243
244        c = a.linearCombination(t, b, t);
245        d = c.linearCombination(t, b, s);
246        //System.out.println("c = " + c);
247        //System.out.println("d = " + d);
248        assertEquals("a*1+b*1+b*(-1) = a", a, d);
249
250        t = cfac.getZERO();
251        //System.out.println("t = " + t);
252        c = a.linearCombination(b, t);
253        //System.out.println("c = " + c);
254        assertEquals("a+0*b = a", a, c);
255
256        d = a.linearCombination(t, b, t);
257        //System.out.println("d = " + d);
258        assertEquals("0*a+0*b = 0", mfac.getZERO(), d);
259    }
260
261
262    /**
263     * Test (simple) multiplication.
264     */
265    public void testSimpleMultiplication() {
266        BigRational cfac = new BigRational(1);
267        GenMatrixRing<BigRational> mfac = new GenMatrixRing<BigRational>(cfac, rows, cols);
268        GenMatrix<BigRational> a, b, c, d, e, f;
269
270        a = mfac.getZERO();
271        b = mfac.getZERO();
272        c = a.multiplySimple(b);
273        //System.out.println("a = " + a);
274        //System.out.println("b = " + b);
275        //System.out.println("c = " + c);
276        assertTrue("0*0 = 0 ", c.isZERO());
277
278        a = mfac.getONE();
279        b = mfac.getONE();
280        c = a.multiplySimple(b);
281        //System.out.println("a = " + a);
282        //System.out.println("b = " + b);
283        //System.out.println("c = " + c);
284        assertTrue("1*1 = 1 ", c.isONE());
285
286        a = mfac.random(kl, q);
287        b = mfac.getONE();
288        c = a.multiplySimple(b);
289        d = a.multiply(b);
290        //System.out.println("a = " + a);
291        //System.out.println("b = " + b);
292        //System.out.println("c = " + c);
293        //System.out.println("d = " + d);
294        assertEquals("a*1 = a ", a, c);
295        assertEquals("a*1 = a*1 ", c, d);
296
297        c = b.multiplySimple(a);
298        d = a.multiply(b);
299        //System.out.println("a = " + a);
300        //System.out.println("b = " + b);
301        //System.out.println("c = " + c);
302        //System.out.println("d = " + d);
303        assertEquals("1*a = a ", a, c);
304        assertEquals("a*1 = a*1 ", c, d);
305
306        b = mfac.random(kl, q);
307        long s, t;
308        s = System.currentTimeMillis();
309        c = a.multiplySimple(b);
310        s = System.currentTimeMillis() - s;
311        assertTrue("nonsense " + s, s >= 0L);
312        d = b.multiplySimple(a);
313        t = System.currentTimeMillis();
314        e = a.multiply(b);
315        t = System.currentTimeMillis() - t;
316        assertTrue("nonsense " + t, t >= 0L);
317        f = b.multiply(a);
318        //System.out.println("a = " + a);
319        //System.out.println("b = " + b);
320        //System.out.println("c = " + c);
321        //System.out.println("d = " + d);
322        //System.out.println("e = " + e);
323        //System.out.println("f = " + e);
324        //System.out.println("e = " + e);
325        assertTrue("a*b != b*a ", !c.equals(d));
326        assertEquals("a*1 = a*1 ", c, e);
327        assertEquals("a*1 = a*1 ", d, f);
328        //System.out.println("time: s = " + s + ", t = " + t);
329
330        if (!mfac.isAssociative()) {
331            return;
332        }
333        c = mfac.random(kl, q);
334
335        d = a.multiply(b.sum(c));
336        e = (a.multiply(b)).sum(a.multiply(c));
337        assertEquals("a*(b+c) = a*b+a*c", d, e);
338
339        d = a.multiply(b.multiply(c));
340        e = (a.multiply(b)).multiply(c);
341        assertEquals("a*(b*c) = (a*b)*c", d, e);
342    }
343
344
345    /**
346     * Test parse matrix.
347     */
348    public void testParse() {
349        BigRational cfac = new BigRational(1);
350        GenMatrixRing<BigRational> mfac = new GenMatrixRing<BigRational>(cfac, rows, cols);
351
352        GenMatrix<BigRational> a, c;
353
354        a = mfac.random(kl, q);
355        //System.out.println("a = " + a);
356        if (!a.isZERO()) {
357            //return;
358            assertTrue(" not isZERO( a )", !a.isZERO());
359        }
360        String s = a.toString();
361        //System.out.println("s = " + s);
362        c = mfac.parse(s);
363        //System.out.println("c = " + c);
364        assertEquals("parse(toStirng(a) == a ", a, c);
365    }
366
367}