package jcuda.jcublas.ops;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.nd4j.jita.allocator.enums.AllocationStatus;
import org.nd4j.jita.conf.Configuration;
import org.nd4j.jita.conf.CudaEnvironment;
import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.api.ops.impl.accum.distances.CosineSimilarity;
import org.nd4j.linalg.api.ops.impl.accum.distances.EuclideanDistance;
import org.nd4j.linalg.api.ops.impl.accum.distances.ManhattanDistance;
import org.nd4j.linalg.factory.Nd4j;
import org.nd4j.linalg.ops.transforms.Transforms;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
/**
* @author raver119@gmail.com
*/
@Ignore
public class CudaReduce3Tests {
@Before
public void setUp() {
CudaEnvironment.getInstance().getConfiguration()
.setFirstMemory(AllocationStatus.DEVICE)
.setAllocationModel(Configuration.AllocationModel.DIRECT)
.setMaximumBlockSize(32)
.enableDebug(true)
.setVerbose(true);
System.out.println("Init called");
}
/**
* Norm2 + cuBlas dot call
*
* @throws Exception
*/
@Test
public void testPinnedCosineSim() throws Exception {
// simple way to stop test if we're not on CUDA backend here
INDArray array1 = Nd4j.create(new float[]{2.01f, 2.01f, 1.01f, 1.01f, 1.01f, 1.01f, 1.01f, 1.01f, 1.01f, 1.01f, 1.01f, 1.01f, 1.01f, 1.01f, 1.01f});
INDArray array2 = Nd4j.create(new float[]{1.00f, 1.00f, 1.00f, 1.00f, 1.00f, 1.00f, 1.00f, 1.00f, 1.00f, 1.00f, 1.00f, 1.00f, 1.00f, 1.00f, 1.00f});
double similarity = Transforms.cosineSim(array1, array2);
System.out.println("Cosine similarity: " + similarity);
assertEquals(0.95f, similarity, 0.01f);
}
@Test
public void testPinnedManhattanDistance() throws Exception {
// simple way to stop test if we're not on CUDA backend here
INDArray array1 = Nd4j.create(new float[]{0.0f, 1.0f, 2.0f, 3.0f, 4.0f});
INDArray array2 = Nd4j.create(new float[]{0.5f, 1.5f, 2.5f, 3.5f, 4.5f});
double result = Nd4j.getExecutioner().execAndReturn(new ManhattanDistance(array1, array2)).getFinalResult().doubleValue();
System.out.println("Distance: " + result);
assertEquals(2.5, result, 0.01);
System.out.println("Array1: " + array1);
System.out.println("Array2: " + array2);
}
@Test
public void testPinnedEuclideanDistance() throws Exception {
// simple way to stop test if we're not on CUDA backend here
INDArray array1 = Nd4j.create(new float[]{0.0f, 1.0f, 2.0f, 3.0f, 4.0f});
INDArray array2 = Nd4j.create(new float[]{0.5f, 1.5f, 2.5f, 3.5f, 4.5f});
double result = Nd4j.getExecutioner().execAndReturn(new EuclideanDistance(array1,array2)).getFinalResult().doubleValue();
System.out.println("Distance: " + result);
assertEquals(1.118033988749895, result, 0.01);
}
@Test
public void testPinnedEuclideanDistance2() throws Exception {
INDArray array1 = Nd4j.linspace(1, 10000, 10000);
INDArray array2 = Nd4j.linspace(1, 9000, 10000);
float result = Nd4j.getExecutioner().execAndReturn(new EuclideanDistance(array1,array2)).getFinalResult().floatValue();
System.out.println("Distance: " + result);
assertEquals(57736.473f, result, 0.01f);
}
@Test
public void testPinnedManhattanDistance2() throws Exception {
// simple way to stop test if we're not on CUDA backend here
INDArray array1 = Nd4j.linspace(1, 1000, 1000);
INDArray array2 = Nd4j.linspace(1, 900, 1000);
double result = Nd4j.getExecutioner().execAndReturn(new ManhattanDistance(array1, array2)).getFinalResult().doubleValue();
assertEquals(50000.0, result, 0.001f);
}
@Test
public void testPinnedCosineSimilarity2() throws Exception {
// simple way to stop test if we're not on CUDA backend here
INDArray array1 = Nd4j.linspace(1, 1000, 1000);
INDArray array2 = Nd4j.linspace(100, 200, 1000);
double result = Nd4j.getExecutioner().execAndReturn(new CosineSimilarity(array1, array2)).getFinalResult().doubleValue();
assertEquals(0.945f, result, 0.001f);
}
@Test
public void testPinnedEuclideanDistance3() throws Exception {
INDArray array1 = Nd4j.linspace(1, 10000, 130);
INDArray array2 = Nd4j.linspace(1, 9000, 130);
float result = Nd4j.getExecutioner().execAndReturn(new EuclideanDistance(array1,array2)).getFinalResult().floatValue();
System.out.println("Distance: " + result);
assertEquals(6595.551f, result, 0.01f);
}
@Test
public void testPinnedManhattanDistance3() throws Exception {
INDArray array1 = Nd4j.linspace(1, 10000, 98);
INDArray array2 = Nd4j.linspace(1, 9000, 98);
float result = Nd4j.getExecutioner().execAndReturn(new ManhattanDistance(array1, array2)).getFinalResult().floatValue();
assertEquals(49000.004f, result, 0.01f);
}
@Test
public void testEqualityOp1() throws Exception {
INDArray array1 = Nd4j.linspace(1, 10000, 2048);
INDArray array2 = Nd4j.linspace(1, 9000, 2048);
assertNotEquals(array1, array2);
}
@Test
public void testEqualityOp2() throws Exception {
INDArray array1 = Nd4j.linspace(1, 10000, 2048);
INDArray array2 = Nd4j.linspace(1, 10000, 2048);
assertEquals(array1, array2);
}
}