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