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