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.transforms.*;
import org.nd4j.linalg.convolution.Convolution;
import org.nd4j.linalg.convolution.OldConvolution;
import org.nd4j.linalg.factory.Nd4j;
import java.util.Arrays;
import static org.junit.Assert.*;
/**
* @author raver119@gmail.com
*/
@Ignore
public class CudaTransformsTests {
@Before
public void setUp() {
CudaEnvironment.getInstance().getConfiguration()
.setFirstMemory(AllocationStatus.DEVICE)
.setExecutionModel(Configuration.ExecutionModel.ASYNCHRONOUS)
.setAllocationModel(Configuration.AllocationModel.CACHE_ALL)
.setMaximumSingleDeviceAllocation(1024 * 1024 * 1024L)
.setMaximumBlockSize(128)
.setMaximumGridSize(256)
.enableDebug(false)
.setVerbose(false);
System.out.println("Init called");
}
@Test
public void testPinnedCosine() throws Exception {
// simple way to stop test if we're not on CUDA backend here
assertEquals("JcublasLevel1", Nd4j.getBlasWrapper().level1().getClass().getSimpleName());
INDArray array1 = Nd4j.create(new float[]{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, 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});
Nd4j.getExecutioner().exec(new Cos(array1, array2));
System.out.println("Array1: " + array1);
System.out.println("Array2: " + array2);
assertEquals(0.53f, array2.getFloat(0), 0.01);
}
@Test
public void testPinnedAbs() throws Exception {
// simple way to stop test if we're not on CUDA backend here
assertEquals("JcublasLevel1", Nd4j.getBlasWrapper().level1().getClass().getSimpleName());
INDArray array1 = Nd4j.create(new float[]{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, 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});
Nd4j.getExecutioner().exec(new Abs(array1, array2));
System.out.println("Array1: " + array1);
System.out.println("Array2: " + array2);
assertEquals(1.01f, array2.getFloat(0), 0.01);
}
@Test
public void testPinnedCeil() throws Exception {
// simple way to stop test if we're not on CUDA backend here
assertEquals("JcublasLevel1", Nd4j.getBlasWrapper().level1().getClass().getSimpleName());
INDArray array1 = Nd4j.create(new float[]{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, 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});
Nd4j.getExecutioner().exec(new Ceil(array1, array2));
System.out.println("Array1: " + array1);
System.out.println("Array2: " + array2);
assertEquals(2.0f, array2.getFloat(0), 0.01);
}
@Test
public void testPinnedExp() throws Exception {
// simple way to stop test if we're not on CUDA backend here
assertEquals("JcublasLevel1", Nd4j.getBlasWrapper().level1().getClass().getSimpleName());
INDArray array1 = Nd4j.create(new float[]{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, 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});
Nd4j.getExecutioner().exec(new Exp(array1, array2));
System.out.println("Array1: " + array1);
System.out.println("Array2: " + array2);
assertEquals(2.75f, array2.getFloat(0), 0.01);
}
@Test
public void testPinnedExp2() throws Exception {
// simple way to stop test if we're not on CUDA backend here
assertEquals("JcublasLevel1", Nd4j.getBlasWrapper().level1().getClass().getSimpleName());
INDArray array1 = Nd4j.create(new float[]{0.9f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f});
Nd4j.getExecutioner().exec(new Exp(array1));
System.out.println("Array1: " + array1);
assertEquals(2.45f, array1.getFloat(0), 0.01);
assertEquals(1.0f, array1.getFloat(1), 0.01);
}
@Test
public void testPinnedFloor() throws Exception {
// simple way to stop test if we're not on CUDA backend here
assertEquals("JcublasLevel1", Nd4j.getBlasWrapper().level1().getClass().getSimpleName());
INDArray array1 = Nd4j.create(new float[]{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, 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});
Nd4j.getExecutioner().exec(new Floor(array1, array2));
System.out.println("Array1: " + array1);
System.out.println("Array2: " + array2);
assertEquals(1.0f, array2.getFloat(0), 0.01);
}
@Test
public void testPinnedLog() throws Exception {
// simple way to stop test if we're not on CUDA backend here
assertEquals("JcublasLevel1", Nd4j.getBlasWrapper().level1().getClass().getSimpleName());
INDArray array1 = Nd4j.create(new float[]{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, 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});
Nd4j.getExecutioner().exec(new Log(array1, array2));
System.out.println("Array1: " + array1);
System.out.println("Array2: " + array2);
assertEquals(0.01f, array2.getFloat(0), 0.01);
}
@Test
public void testPinnedPow() throws Exception {
// simple way to stop test if we're not on CUDA backend here
assertEquals("JcublasLevel1", Nd4j.getBlasWrapper().level1().getClass().getSimpleName());
INDArray array1 = Nd4j.create(new float[]{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, 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});
System.out.println("Array1: " + array1);
System.out.println("Array2: " + array2);
Nd4j.getExecutioner().exec(new Pow(array1, 3));
System.out.println("Array1: " + array1);
System.out.println("Array2: " + array2);
assertEquals(1.03f, array1.getFloat(0), 0.01);
}
@Test
public void testPinnedSetRange() throws Exception {
// simple way to stop test if we're not on CUDA backend here
assertEquals("JcublasLevel1", Nd4j.getBlasWrapper().level1().getClass().getSimpleName());
INDArray array1 = Nd4j.create(new float[]{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, 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});
Nd4j.getExecutioner().exec(new SetRange(array1, 0.1f, 1.0f));
System.out.println("Array1: " + array1);
System.out.println("Array2: " + array2);
assertEquals(0.1f, array1.getFloat(0), 0.01);
}
@Test
public void testPinnedSigmoid() throws Exception {
// simple way to stop test if we're not on CUDA backend here
assertEquals("JcublasLevel1", Nd4j.getBlasWrapper().level1().getClass().getSimpleName());
INDArray array1 = Nd4j.create(new float[]{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, 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});
Nd4j.getExecutioner().exec(new Sigmoid(array1, array2));
System.out.println("Array1: " + array1);
System.out.println("Array2: " + array2);
assertEquals(0.73f, array2.getFloat(0), 0.01);
}
@Test
public void testPinnedSign() throws Exception {
// simple way to stop test if we're not on CUDA backend here
assertEquals("JcublasLevel1", Nd4j.getBlasWrapper().level1().getClass().getSimpleName());
INDArray array1 = Nd4j.create(new float[]{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, 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});
Nd4j.getExecutioner().exec(new Sign(array1, array2));
System.out.println("Array1: " + array1);
System.out.println("Array2: " + array2);
assertEquals(1.0f, array2.getFloat(0), 0.01);
}
@Test
public void testPinnedSin() throws Exception {
// simple way to stop test if we're not on CUDA backend here
assertEquals("JcublasLevel1", Nd4j.getBlasWrapper().level1().getClass().getSimpleName());
INDArray array1 = Nd4j.create(new float[]{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, 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});
Nd4j.getExecutioner().exec(new Sin(array1, array2));
System.out.println("Array1: " + array1);
System.out.println("Array2: " + array2);
assertEquals(0.85f, array2.getFloat(0), 0.01);
}
@Test
public void testPinnedSoftplus() throws Exception {
// simple way to stop test if we're not on CUDA backend here
assertEquals("JcublasLevel1", Nd4j.getBlasWrapper().level1().getClass().getSimpleName());
INDArray array1 = Nd4j.create(new float[]{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, 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});
Nd4j.getExecutioner().exec(new SoftPlus(array1, array2));
System.out.println("Array1: " + array1);
System.out.println("Array2: " + array2);
assertEquals(1.32f, array2.getFloat(0), 0.01);
}
@Test
public void testPinnedSqrt() throws Exception {
// simple way to stop test if we're not on CUDA backend here
assertEquals("JcublasLevel1", Nd4j.getBlasWrapper().level1().getClass().getSimpleName());
INDArray array1 = Nd4j.create(new float[]{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, 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});
Nd4j.getExecutioner().exec(new Sqrt(array1, array2));
System.out.println("Array1: " + array1);
System.out.println("Array2: " + array2);
assertEquals(1.42f, array2.getFloat(0), 0.01);
}
@Test
public void testPinnedTanh() throws Exception {
// simple way to stop test if we're not on CUDA backend here
assertEquals("JcublasLevel1", Nd4j.getBlasWrapper().level1().getClass().getSimpleName());
INDArray array1 = Nd4j.create(new float[]{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, 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});
Nd4j.getExecutioner().exec(new Tanh(array1, array2));
System.out.println("Array1: " + array1);
System.out.println("Array2: " + array2);
assertEquals(0.77f, array2.getFloat(0), 0.01);
}
@Test
public void testPinnedAcos() throws Exception {
// simple way to stop test if we're not on CUDA backend here
assertEquals("JcublasLevel1", Nd4j.getBlasWrapper().level1().getClass().getSimpleName());
INDArray array1 = Nd4j.create(new float[]{0.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, 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});
Nd4j.getExecutioner().exec(new ACos(array1, array2));
System.out.println("Array1: " + array1);
System.out.println("Array2: " + array2);
assertEquals(1.56f, array2.getFloat(0), 0.01);
}
@Test
public void testPinnedASin() throws Exception {
// simple way to stop test if we're not on CUDA backend here
assertEquals("JcublasLevel1", Nd4j.getBlasWrapper().level1().getClass().getSimpleName());
//INDArray array1 = Nd4j.create(new float[]{0.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, 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});
INDArray array1 = Nd4j.create(new float[]{0.01f, 1.01f, });
INDArray array2 = Nd4j.create(new float[]{1.00f, 1.00f, });
Nd4j.getExecutioner().exec(new ASin(array1, array2));
System.out.println("Array1: " + array1);
System.out.println("Array2: " + array2);
assertEquals(0.01f, array2.getFloat(0), 0.01);
}
@Test
public void testPinnedATan() throws Exception {
// simple way to stop test if we're not on CUDA backend here
assertEquals("JcublasLevel1", Nd4j.getBlasWrapper().level1().getClass().getSimpleName());
INDArray array1 = Nd4j.create(new float[]{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, 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});
Nd4j.getExecutioner().exec(new ATan(array1, array2));
System.out.println("Array1: " + array1);
System.out.println("Array2: " + array2);
assertEquals(0.79f, array2.getFloat(0), 0.01);
}
@Test
public void testPinnedNegative() throws Exception {
// simple way to stop test if we're not on CUDA backend here
assertEquals("JcublasLevel1", Nd4j.getBlasWrapper().level1().getClass().getSimpleName());
INDArray array1 = Nd4j.create(new float[]{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, 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});
Nd4j.getExecutioner().exec(new Negative(array1, array2));
System.out.println("Array1: " + array1);
System.out.println("Array2: " + array2);
assertEquals(-1.01f, array2.getFloat(0), 0.01);
}
@Test
public void testPinnedCosineF() throws Exception {
// simple way to stop test if we're not on CUDA backend here
assertEquals("JcublasLevel1", Nd4j.getBlasWrapper().level1().getClass().getSimpleName());
INDArray array1 = Nd4j.create(new float[]{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, 1.01f, 1.01f});//.dup('f');
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});
Nd4j.getExecutioner().exec(new Cos(array1, array2));
System.out.println("Array1: " + array1);
System.out.println("Array2: " + array2);
assertEquals(0.53f, array2.getFloat(0), 0.01);
}
@Test
public void testSoftmaxFC() throws Exception {
INDArray array1 = Nd4j.ones(2048).dup('f');
INDArray array2 = Nd4j.zeros(2048);
Nd4j.getExecutioner().exec(new SoftMax(array1));
Nd4j.getExecutioner().exec(new SoftMax(array2));
System.out.println("Array1: " + Arrays.toString(array1.data().asFloat()));
System.out.println("Array2: " + Arrays.toString(array2.data().asFloat()));
//assertEquals(array1, array2);
assertEquals(1.0, array1.sumNumber().doubleValue(), 0.0001);
assertEquals(1.0, array2.sumNumber().doubleValue(), 0.0001);
}
@Test
public void testLogSoftmaxFC() throws Exception {
INDArray array1 = Nd4j.ones(2048).dup('f');
INDArray array2 = Nd4j.zeros(2048);
Nd4j.getExecutioner().exec(new LogSoftMax(array1));
Nd4j.getExecutioner().exec(new LogSoftMax(array2));
System.out.println("Array1: " + Arrays.toString(array1.data().asFloat()));
System.out.println("Array2: " + Arrays.toString(array2.data().asFloat()));
assertEquals(array1, array2);
//assertEquals(1.0, array1.sumNumber().doubleValue(), 0.0001);
//assertEquals(1.0, array2.sumNumber().doubleValue(), 0.0001);
}
@Test
public void testSoftmaxDerivativeFC() throws Exception {
INDArray array1 = Nd4j.ones(2048).dup('f');
INDArray array2 = Nd4j.zeros(2048);
Nd4j.getExecutioner().exec(new SoftMaxDerivative(array1));
Nd4j.getExecutioner().exec(new SoftMaxDerivative(array2));
System.out.println("Array1: " + Arrays.toString(array1.data().asFloat()));
System.out.println("Array2: " + Arrays.toString(array2.data().asFloat()));
assertEquals(array1, array2);
assertEquals(1.0, array1.sumNumber().doubleValue(), 0.001);
assertEquals(1.0, array2.sumNumber().doubleValue(), 0.001);
}
@Test
public void testIsMaxEqualValues(){
//Nd4j.dtype = DataBuffer.Type.DOUBLE;
//Assumption here: should only have a 1 for *first* maximum value, if multiple values are exactly equal
//[1 1 1] -> [1 0 0]
//Loop to double check against any threading weirdness...
for( int i=0; i<10; i++ ) {
assertEquals(Nd4j.create(new double[]{1, 0, 0}), Nd4j.getExecutioner().execAndReturn(new IsMax(Nd4j.ones(3))));
}
//[0 0 0 2 2 0] -> [0 0 0 1 0 0]
assertEquals(Nd4j.create(new double[]{0, 0, 0, 1, 0, 0}), Nd4j.getExecutioner().execAndReturn(new IsMax(Nd4j.create(new double[]{0, 0, 0, 2, 2, 0}))));
//[0 2] [0 1]
//[2 1] -> [0 0]
INDArray orig = Nd4j.create(new double[][]{{0, 2}, {2, 1}});
INDArray exp = Nd4j.create(new double[][]{{0, 1}, {0, 0}});
INDArray outc = Nd4j.getExecutioner().execAndReturn(new IsMax(orig.dup('c')));
INDArray outf = Nd4j.getExecutioner().execAndReturn(new IsMax(orig.dup('f')));
System.out.println("Exp: " + Arrays.toString(exp.data().asFloat()));
System.out.println("OutC: " + Arrays.toString(outc.data().asFloat()));
System.out.println("OutF: " + Arrays.toString(outf.data().asFloat()));
System.out.println("outC shapeInfo: " + outc.shapeInfoDataBuffer());
System.out.println("outF shapeInfo: " + outf.shapeInfoDataBuffer());
assertEquals(exp, outc);
assertEquals(exp, outf);
}
@Test
public void testIsMaxMinimized() throws Exception {
System.out.println("A------------------------------");
INDArray orig = Nd4j.create(new double[][]{{0, 2}, {2, 1}});
System.out.println("AA------------------------------");
INDArray origf = orig.dup('f');
System.out.println("AB------------------------------");
INDArray outf = Nd4j.getExecutioner().execAndReturn(new IsMax(origf));
System.out.println("AC------------------------------");
INDArray exp = Nd4j.create(new double[][]{{0, 1}, {0, 0}});
System.out.println("A0------------------------------");
System.out.println("exp data: " +Arrays.toString(exp.data().asFloat()));
System.out.println("A1------------------------------");
System.out.println("OutF data: " +Arrays.toString(outf.data().asFloat()));
System.out.println("A2------------------------------");
System.out.println("exp shape: " + exp.shapeInfoDataBuffer());
System.out.println("A3------------------------------");
System.out.println("OutF shape: " + outf.shapeInfoDataBuffer());
System.out.println("A4------------------------------");
System.out.println("exp: " + exp);
System.out.println("A5------------------------------");
System.out.println("OutF: " + outf);
System.out.println("A6------------------------------");
assertEquals(exp, outf);
}
@Test
public void testSoftmaxSmall() throws Exception {
INDArray array1 = Nd4j.zeros(15);
array1.putScalar(0, 0.9f);
Nd4j.getExecutioner().exec(new SoftMax(array1));
System.out.println("Array1: " + Arrays.toString(array1.data().asFloat()));
assertEquals(1.0, array1.sumNumber().doubleValue(), 0.0001);
assertEquals(0.14f, array1.getFloat(0), 0.01f);
}
@Test
public void testClassificationSoftmax() throws Exception {
INDArray input = Nd4j.zeros(256, 3000);
System.out.println("A0: --------------------------------");
for (int i = 0; i < 256; i++) {
input.putScalar(3000 * i, (i * 2) + 0.5);
}
System.out.println("AF: --------------------------------");
// AtomicAllocator.getInstance().getPointer(input);
// AtomicAllocator.getInstance().getPointer(input.shapeInfoDataBuffer());
System.out.println("AX: --------------------------------");
// AtomicAllocator.getInstance().getPointer(input);
// AtomicAllocator.getInstance().getPointer(input.shapeInfoDataBuffer());
System.out.println("AA: --------------------------------");
float sumAll = input.sumNumber().floatValue();
System.out.println("A1: --------------------------------");
System.out.println("Data:" + input.data().length() + " Sum: " + sumAll);
assertEquals(65408.0f, sumAll, 0.01f);
System.out.println("A2: --------------------------------");
SoftMax softMax = new SoftMax(input);
long time1 = System.currentTimeMillis();
Nd4j.getExecutioner().exec(softMax);
long time2 = System.currentTimeMillis();
System.out.println("A3: --------------------------------");
System.out.println("Execution time: " + (time2 - time1));
/*
assertEquals(0.036710344f,input.getFloat(0), 0.01f);
assertEquals(0.023549506f,input.getFloat(152), 0.01f);
assertEquals(0.005180763f,input.getFloat(310), 0.01f);
assertEquals(4.5634616E-7f,input.getFloat(879), 0.01f);
*/
for (int i = 0; i < 256; i++) {
INDArray slice = input.slice(i);
System.out.println("Position [0]: " + input.getDouble(3000 * i) + ", [1]: " + input.getDouble(3000 * i + 1));
assertTrue(input.getDouble(3000 * i) > input.getDouble(3000 * i + 1));
float sum = slice.sumNumber().floatValue();
assertEquals("Failed on iteration ["+i+"]", 1.0f, sum, 0.01f);
}
}
@Test
public void testTanhXZ(){
INDArray arrC = Nd4j.linspace(-6,6,12).reshape('c',4,3);
INDArray arrF = Nd4j.create(new int[]{4,3},'f').assign(arrC);
double[] d = arrC.data().asDouble();
double[] e = new double[d.length];
for(int i=0; i<e.length; i++ ) e[i] = Math.tanh(d[i]);
INDArray exp = Nd4j.create(e, new int[]{4,3}, 'c');
//First: do op with just x (inplace)
INDArray arrFCopy = arrF.dup('f');
INDArray arrCCopy = arrF.dup('c');
Nd4j.getExecutioner().exec(new Tanh(arrFCopy));
Nd4j.getExecutioner().exec(new Tanh(arrCCopy));
System.out.println("ArrF shape: " + arrFCopy.shapeInfoDataBuffer());
System.out.println("ArrC shape: " + arrCCopy.shapeInfoDataBuffer());
assertEquals(exp, arrCCopy);
assertEquals(exp, arrFCopy);
//Second: do op with both x and z:
INDArray zOutFC = Nd4j.create(new int[]{4,3},'c');
INDArray zOutFF = Nd4j.create(new int[]{4,3},'f');
INDArray zOutCC = Nd4j.create(new int[]{4,3},'c');
INDArray zOutCF = Nd4j.create(new int[]{4,3},'f');
System.out.println("arrF order: " + arrF.ordering());
System.out.println("zOutFC order: " + zOutFC.ordering());
Nd4j.getExecutioner().exec(new Tanh(arrF, zOutFC));
// Nd4j.getExecutioner().exec(new Tanh(arrF, zOutFF));
// Nd4j.getExecutioner().exec(new Tanh(arrC, zOutCC));
// Nd4j.getExecutioner().exec(new Tanh(arrC, zOutCF));
assertEquals(exp, zOutFC); //fails
//assertEquals(exp, zOutFF); //pass
//assertEquals(exp, zOutCC); //pass
//assertEquals(exp, zOutCF); //fails
}
@Test
public void testCol2Im2() {
int kh = 1;
int kw = 1;
int sy = 1;
int sx = 1;
int ph = 1;
int pw = 1;
INDArray linspaced = Nd4j.linspace(1,64,64).reshape(2,2,2,2,2,2);
INDArray newTest = Convolution.col2im(linspaced,sy,sx,ph,pw,2,2);
INDArray assertion = OldConvolution.col2im(linspaced,sy,sx,ph,pw,2,2);
System.out.println("Assertion dimensions: " + Arrays.toString(assertion.shape()));
System.out.println("Assertion data: " + Arrays.toString(assertion.data().asFloat()));
System.out.println("Result data: " + Arrays.toString(newTest.data().asFloat()));
assertEquals(assertion,newTest);
}
@Test
public void testTransformExp() throws Exception {
INDArray array1 = Nd4j.zeros(1500,150);
//System.out.println("ShapeBuffer: " + array1.shapeInfoDataBuffer());
Exp exp = new Exp(array1);
long time1 = System.currentTimeMillis();
Nd4j.getExecutioner().exec(exp);
long time2 = System.currentTimeMillis();
System.out.println("Execution time: ["+ (time2 - time1)+"]");
for (int x = 0; x < 1500 * 150; x++) {
assertEquals("Failed on iteration ["+ x+"]",1f, array1.getFloat(x), 0.0001f);
}
//Thread.sleep(100000000000L);
}
@Test
public void testIsMaxDimensional() throws Exception {
INDArray arr = Nd4j.create(new int[]{51200,4},'c');
INDArray epsilon = Nd4j.create(new int[]{51200,1},'c');
/*
int[] kernel = {2,2};
int[] strides = {2,2};
int[] pad = {0,0};
INDArray col6d = Nd4j.create(new int[]{64,50,4,4,2,2},'c');
INDArray col6dPermuted = col6d.permute(0,1,4,5,2,3);
Convolution.im2col(input, kernel[0], kernel[1], strides[0], strides[1], pad[0], pad[1], false, col6dPermuted);
int miniBatch = 64;
int depth = 50;
int outH = 4;
int outW = 4;
INDArray col2d = col6d.reshape('c',miniBatch*depth*outH*outW,kernel[0]*kernel[1]);
for( int i=0; i<1000;i ++ ){
System.out.println(i);
Convolution.im2col(col2d, kernel[0], kernel[1], strides[0], strides[1], pad[0], pad[1], false, col6dPermuted);
INDArray isMax = Nd4j.getExecutioner().execAndReturn(new IsMax(col2d,1));
isMax.muliColumnVector(epsilon);
}
*/
INDArray input = Nd4j.create(new int[]{64,50,8,8},'c');
for( int i=0; i<10;i ++ ){
INDArray isMax = Nd4j.getExecutioner().execAndReturn(new IsMax(arr,1));
}
}
@Test
public void testSignXZ(){
double[] d = {1.0, -1.1, 1.2, 1.3, -1.4, -1.5, 1.6, -1.7, -1.8, -1.9, -1.01, -1.011};
double[] e = {1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0};
INDArray arrF = Nd4j.create(d,new int[]{4,3},'f');
INDArray arrC = Nd4j.create(new int[]{4,3},'c').assign(arrF);
INDArray exp = Nd4j.create(e, new int[]{4,3}, 'f');
//First: do op with just x (inplace)
INDArray arrFCopy = arrF.dup('f');
INDArray arrCCopy = arrC.dup('c');
Nd4j.getExecutioner().exec(new Sign(arrFCopy));
Nd4j.getExecutioner().exec(new Sign(arrCCopy));
assertEquals(exp, arrFCopy);
assertEquals(exp, arrCCopy);
//Second: do op with both x and z:
INDArray zOutFC = Nd4j.create(new int[]{4,3},'c');
INDArray zOutFF = Nd4j.create(new int[]{4,3},'f');
INDArray zOutCC = Nd4j.create(new int[]{4,3},'c');
INDArray zOutCF = Nd4j.create(new int[]{4,3},'f');
Nd4j.getExecutioner().exec(new Sign(arrF, zOutFC));
Nd4j.getExecutioner().exec(new Sign(arrF, zOutFF));
Nd4j.getExecutioner().exec(new Sign(arrC, zOutCC));
Nd4j.getExecutioner().exec(new Sign(arrC, zOutCF));
assertEquals(exp, zOutFC); //fails
assertEquals(exp, zOutFF); //pass
assertEquals(exp, zOutCC); //pass
assertEquals(exp, zOutCF); //fails
}
@Test
public void testSoftmax1D_1() throws Exception {
INDArray input1T = Nd4j.create(new double[]{ -0.75, 0.58, 0.42, 1.03, -0.61, 0.19, -0.37, -0.40, -1.42, -0.04}).transpose();
INDArray input1 = Nd4j.create(new double[]{ -0.75, 0.58, 0.42, 1.03, -0.61, 0.19, -0.37, -0.40, -1.42, -0.04});
INDArray input2 = Nd4j.zerosLike(input1);
Nd4j.copy(input1, input2);
INDArray output1 = Nd4j.create(1, 10);
INDArray output1T = Nd4j.create(1, 10);
System.out.println("FA --------------------");
Nd4j.getExecutioner().exec(new SoftMax(input1, output1));
Nd4j.getExecutioner().exec(new SoftMax(input1T, output1T));
System.out.println("FB --------------------");
System.out.println("Softmax = " + output1);
INDArray output2 = Nd4j.create(1,10);
Nd4j.getExecutioner().exec(new SoftMaxDerivative(input2, output2));
System.out.println("Softmax Derivative = " + output2);
INDArray assertion1 = Nd4j.create(new double[]{0.04, 0.16, 0.14, 0.26, 0.05, 0.11, 0.06, 0.06, 0.02, 0.09});
assertArrayEquals(assertion1.data().asFloat(), output1.data().asFloat(), 0.01f);
assertArrayEquals(assertion1.data().asFloat(), output1T.data().asFloat(), 0.01f);
}
@Test
public void testSoftmax2D_T() {
INDArray input1 = Nd4j.create(1000).transpose();
INDArray input2 = Nd4j.zerosLike(input1);
Nd4j.copy(input1, input2);
INDArray output1 = Nd4j.create(1, 1000);
Nd4j.getExecutioner().exec(new SoftMax(input1, output1));
System.out.println("Softmax = " + output1);
INDArray output2 = Nd4j.create(1,1000);
Nd4j.getExecutioner().exec(new SoftMaxDerivative(input2, output2));
System.out.println("Softmax Derivative = " + output2);
assertEquals(1.0f, output1.sumNumber().floatValue(), 0.01f);
assertEquals(1.0f, output2.sumNumber().floatValue(), 0.01f);
}
}