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 }