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 }