package mikera.arrayz; import static org.junit.Assert.*; import org.junit.Test; import mikera.indexz.Indexz; import mikera.matrixx.AMatrix; import mikera.matrixx.Matrixx; import mikera.matrixx.impl.IdentityMatrix; import mikera.matrixx.impl.SparseRowMatrix; import mikera.matrixx.impl.ZeroMatrix; import mikera.util.Random; import mikera.vectorz.AVector; import mikera.vectorz.Scalar; import mikera.vectorz.Vectorz; import mikera.vectorz.impl.RangeVector; import mikera.vectorz.impl.RepeatedElementVector; import mikera.vectorz.impl.SparseIndexedVector; /** * Set of tests designed to test large array handling * All of these *should* run very fast (range of milliseconds) * * If it is taking much longer, e.g. more than 1s, then there is a problem * with the corresponding sparse implementation * * @author Mike * */ public class TestBigSparse { private void testBigStats(AMatrix m) { assertEquals(400000000L,m.elementCount()); assertEquals(0,m.nonZeroCount()); assertEquals(0.0,m.elementSum(),0.0); assertEquals(0.0,m.elementSquaredSum(),0.0); assertEquals(0.0,m.elementMax(),0.0); assertEquals(0.0,m.elementMin(),0.0); } @Test public void testBigArray() { INDArray m=Arrayz.createSparseArray(20000,20000); assertEquals(400000000L,m.elementCount()); } @Test public void testBigMatrix() { AMatrix m=Matrixx.createSparse(20000,20000); testBigStats(m); testBigStats(m.getTranspose()); m.set(3,4,7.0); assertEquals(m,m.exactClone()); AMatrix mt=m.getTranspose(); assertEquals(m.getTranspose(),mt); assertTrue(m.density()<0.0001); } @Test public void testBigMultiply() { int SIZE=100000; AMatrix m=Matrixx.createSparse(SIZE,SIZE); m.set(3,4,7.0); AMatrix r=m.innerProduct(m.getTranspose()); assertEquals(49.0,r.get(3,3),0.0); assertEquals(49.0,r.elementSum(),0.0); r.multiply(1.0/7.0); assertEquals(7.0,r.get(3,3),0.0); assertEquals(7.0,r.elementSum(),0.0); } @Test public void testBigMultiply2() { int SIZE=1000; AMatrix m=Matrixx.createSparse(SIZE,SIZE); Random r=new Random(342345234); for (int i=0; i<SIZE; i++) { m.set(r.nextInt(SIZE),r.nextInt(SIZE),r.nextGaussian()); } m.innerProduct(m.getTranspose()); } @Test public void testBigMultiply3() { int SIZE=1000; AMatrix m=Matrixx.createSparse(SIZE,SIZE); Random r=new Random(342345237); for (int i=0; i<SIZE; i++) { m.set(r.nextInt(SIZE),r.nextInt(SIZE),r.nextGaussian()); } m.innerProduct(m); } @Test public void testSparseAdd() { AMatrix m=Matrixx.createSparse(20000,20000); m.add(ZeroMatrix.create(20000, 20000)); assertTrue(m.isZero()); AMatrix mz=m.addCopy(Matrixx.createSparse(20000,20000)); assertTrue(mz.isZero()); } @Test public void testSparseInnerProduct() { int SIZE=100000; AMatrix m=Matrixx.createSparse(SIZE,SIZE); AMatrix mt=m.getTranspose(); AMatrix mmt = m.innerProduct(mt); assertTrue(mmt.isSameShape(m)); m.innerProduct(m); } @Test public void testBigZeros() { int SIZE=100000; AMatrix m=ZeroMatrix.create(SIZE, SIZE); m=m.sparseClone(); assertTrue("Not fully sparse:" +m.getClass(), m.isFullyMutable()); m.set(3,4,7.0); assertEquals(1,m.nonZeroCount()); } @Test public void testBigDotProduct() { int SIZE=1000000000; AVector v=Vectorz.createSparseMutable(SIZE); v.set(100,1.0); v.set(1000,2.0); AVector v2=Vectorz.createRange(SIZE); assertEquals(2100,v.dotProduct(v2),0.0); AVector v3=v.clone(); v3.set(100,0.0); v3.set(101,4.0); assertEquals(4.0,v.dotProduct(v3),0.0); } @Test public void testBigSparseDotProduct() { int SIZE=1000000000; int VALS=1000; AVector a=SparseIndexedVector.create(VALS, Indexz.createRandomChoice(VALS, SIZE), Vectorz.createUniformRandomVector(VALS)); AVector b=SparseIndexedVector.create(VALS, Indexz.createRandomChoice(VALS, SIZE), Vectorz.createUniformRandomVector(VALS)); a.dotProduct(b); assertEquals(a.magnitudeSquared(),a.dotProduct(a),0.0); } @Test public void testBigVectorAdd() { int SIZE=1000000000; AVector v=Vectorz.createSparseMutable(SIZE); v.set(5000,1.0); AVector v2=v.sparseClone(); v.add(v2); assertEquals(2.0,v.get(5000),0.0); v.addMultiple(v2,3.0); assertEquals(5.0,v.get(5000),0.0); } @Test public void testBigVectorMultiply() { int SIZE=1000000000; AVector v=Vectorz.createSparseMutable(SIZE); // clone with two shared elements v.set(0,5.0); v.set(5000,2.0); AVector v2=v.sparseClone(); // set some other elements v.set(4999,3.0); v2.set(5001,4.0); v.multiply(v2); assertEquals(2,v.nonZeroCount()); assertEquals(25.0,v.get(0),0.0); assertEquals(4.0,v.get(5000),0.0); assertEquals(29.0,v.elementSum(),0.0); v.divide(4.0); assertEquals(2,v.nonZeroCount()); assertEquals(1.0,v.get(5000),0.0); } @Test public void testBigIdentity() { int SIZE=1000000000; AMatrix m=IdentityMatrix.create(SIZE); m=m.sparse(); assertEquals(m,m.innerProduct(m)); assertEquals(m.rowCount(),m.nonZeroCount()); } @Test public void testSparseSet() { int SIZE=300; SparseRowMatrix m=SparseRowMatrix.create(SIZE, SIZE); m.fill(2); assertEquals(2,m.get(10,10),0.0); m.set(Scalar.create(3)); assertEquals(3,m.get(10,10),0.0); m.set(RangeVector.create(0,SIZE)); assertEquals(17,m.get(12,17),0.0); m.set((AMatrix)(Scalar.create(1).broadcast(SIZE,SIZE))); assertEquals(1,m.get(10,10),0.0); m.set((AMatrix)(Scalar.create(2).broadcast(SIZE,SIZE))); assertEquals(2,m.get(SIZE-1,SIZE-1),0.0); m.set(RangeVector.create(0,SIZE).broadcast(SIZE,SIZE)); assertEquals(19,m.get(12,19),0.0); m.setRow(10, RepeatedElementVector.create(SIZE, 7)); assertEquals(7,m.get(10,11),0.0); } }