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}