package com.github.neuralnetworks.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.stream.IntStream;
import org.junit.Test;
import com.amd.aparapi.Kernel.EXECUTION_MODE;
import com.github.neuralnetworks.architecture.GraphConnections;
import com.github.neuralnetworks.architecture.Layer;
import com.github.neuralnetworks.architecture.NeuralNetworkImpl;
import com.github.neuralnetworks.architecture.types.NNFactory;
import com.github.neuralnetworks.calculation.ValuesProvider;
import com.github.neuralnetworks.calculation.neuronfunctions.SoftmaxFunction;
import com.github.neuralnetworks.training.random.MersenneTwisterRandomInitializer;
import com.github.neuralnetworks.training.random.NNRandomInitializer;
import com.github.neuralnetworks.util.Environment;
import com.github.neuralnetworks.util.Matrix;
import com.github.neuralnetworks.util.Tensor;
import com.github.neuralnetworks.util.Util;
public class GeneralTest {
@Test
public void testValuesProvider() {
ValuesProvider vp = new ValuesProvider();
NeuralNetworkImpl nn = new NeuralNetworkImpl();
Layer i = new Layer();
Layer h = new Layer();
Layer o = new Layer();
nn.addLayer(i);
NNFactory.addFullyConnectedLayer(nn, h, 2, 3, true);
NNFactory.addFullyConnectedLayer(nn, o, 4, 1, true);
Matrix im = new Matrix(2, 2);
vp.addValues(i, im);
Matrix hm1 = vp.getValues(h, 3);
Matrix hm2 = new Matrix(4, 2);
vp.addValues(h, hm2);
Matrix om = vp.getValues(o);
assertTrue(im == vp.getValues(i, 2));
assertTrue(im == vp.getValues(i));
assertTrue(hm1 == vp.getValues(h, 3));
assertTrue(hm2 == vp.getValues(h, 4));
assertTrue(hm1 == vp.getValues(h, nn.getConnection(i, h)));
assertTrue(hm2 == vp.getValues(h, nn.getConnection(h, o)));
assertTrue(om == vp.getValues(o, 1));
assertTrue(om == vp.getValues(o));
assertTrue(2 == vp.getColumns());
}
@Test
public void testRandomInitializer() {
NeuralNetworkImpl nn = NNFactory.mlp(new int[] { 3, 2 }, true);
NNRandomInitializer rand = new NNRandomInitializer(new MersenneTwisterRandomInitializer(-0.1f, 0.1f), 0.5f);
rand.initialize(nn);
for (Layer l : nn.getLayers()) {
if (Util.isBias(l)) {
GraphConnections gc = (GraphConnections) l.getConnections().get(0);
for (float v : gc.getConnectionGraph().getElements()) {
assertEquals(0.5, v, 0f);
}
} else {
GraphConnections gc = (GraphConnections) l.getConnections().get(0);
for (float v : gc.getConnectionGraph().getElements()) {
assertTrue(v >= -0.1f && v <= 0.1f && v != 0);
}
}
}
rand = new NNRandomInitializer(new MersenneTwisterRandomInitializer(2f, 3f), new MersenneTwisterRandomInitializer(-2f, -1f));
rand.initialize(nn);
for (Layer l : nn.getLayers()) {
if (Util.isBias(l)) {
GraphConnections gc = (GraphConnections) l.getConnections().get(0);
for (float v : gc.getConnectionGraph().getElements()) {
assertTrue(v >= -2f && v <= -1f);
}
} else {
GraphConnections gc = (GraphConnections) l.getConnections().get(0);
for (float v : gc.getConnectionGraph().getElements()) {
assertTrue(v >= 2f && v <= 3f);
}
}
}
}
@Test
public void testSoftMax() {
Tensor t = new Tensor(5, 4, 2);
IntStream.range(0, t.getElements().length).forEach(i -> t.getElements()[i] = i + 1);
Matrix m = new Matrix(t, new int[] { 1, 1, 1 }, new int[] { 3, 2, 1 });
m.set(1, 0, 0);
m.set(2, 1, 0);
m.set(3, 2, 0);
m.set(4, 0, 1);
m.set(5, 1, 1);
m.set(6, 2, 1);
SoftmaxFunction sf = new SoftmaxFunction();
Environment.getInstance().setExecutionMode(EXECUTION_MODE.SEQ);
sf.value(m);
assertEquals(1 / 6f, m.get(0, 0), 0);
assertEquals(2 / 6f, m.get(1, 0), 0);
assertEquals(3 / 6f, m.get(2, 0), 0);
assertEquals(4 / 15f, m.get(0, 1), 0);
assertEquals(5 / 15f, m.get(1, 1), 0);
assertEquals(6 / 15f, m.get(2, 1), 0);
}
@Test
public void testTensor() {
Tensor t = new Tensor(2, 2, 2);
float[] elements = t.getElements();
assertEquals(8, elements.length, 0);
t.set(1, 0, 0, 0);
t.set(2, 0, 0, 1);
t.set(3, 0, 1, 0);
t.set(4, 0, 1, 1);
t.set(5, 1, 0, 0);
t.set(6, 1, 0, 1);
t.set(7, 1, 1, 0);
t.set(8, 1, 1, 1);
for (int i = 0; i < elements.length; i++) {
assertEquals(i + 1, elements[i], 0);
}
t = new Tensor(5, 5, 5);
assertEquals(25, t.getDimensionElementsDistance(0), 0);
assertEquals(5, t.getDimensionElementsDistance(1), 0);
assertEquals(1, t.getDimensionElementsDistance(2), 0);
elements = t.getElements();
for (int i = 0; i < elements.length; i++) {
elements[i] = i + 1;
}
Tensor t2 = new Tensor(t, new int[] { 3, 0, 0 }, new int[] { 4, 4, 4 });
assertEquals(75, t2.getStartIndex(), 0);
assertEquals(124, t2.getEndIndex(), 0);
assertEquals(25, t2.getDimensionElementsDistance(0), 0);
assertEquals(5, t2.getDimensionElementsDistance(1), 0);
assertEquals(1, t2.getDimensionElementsDistance(2), 0);
assertEquals(50, t2.getSize(), 0);
assertEquals(76, t2.get(0, 0, 0), 0);
assertEquals(77, t2.get(0, 0, 1), 0);
assertEquals(81, t2.get(0, 1, 0), 0);
assertEquals(101, t2.get(1, 0, 0), 0);
assertEquals(106, t2.get(1, 1, 0), 0);
assertEquals(112, t2.get(1, 2, 1), 0);
}
@Test
public void testMatrix() {
Matrix m = new Matrix(5, 6);
assertEquals(5, m.getRows(), 0);
assertEquals(6, m.getColumns(), 0);
assertEquals(6, m.getDimensionElementsDistance(0), 0);
assertEquals(1, m.getDimensionElementsDistance(1), 0);
assertEquals(5, m.getDimensionLength(0), 0);
assertEquals(6, m.getDimensionLength(1), 0);
for (int i = 0; i < m.getElements().length; i++) {
m.getElements()[i] = i + 1;
}
assertEquals(2, m.get(0, 1), 0);
assertEquals(15, m.get(2, 2), 0);
m = new Matrix(1, 6);
for (int i = 0; i < m.getElements().length; i++) {
m.getElements()[i] = i + 1;
}
assertEquals(2, m.get(0, 1), 0);
assertEquals(6, m.get(0, 5), 0);
m = new Matrix(6, 1);
for (int i = 0; i < m.getElements().length; i++) {
m.getElements()[i] = i + 1;
}
assertEquals(2, m.get(1, 0), 0);
assertEquals(6, m.get(5, 0), 0);
// submatrix
Tensor t = new Tensor(5, 5, 5);
float[] elements = t.getElements();
for (int i = 0; i < elements.length; i++) {
elements[i] = i + 1;
}
m = new Matrix(t, new int[] {1, 0, 0}, new int[] {1, 4, 4});
assertEquals(26, m.get(0, 0), 0);
assertEquals(27, m.get(0, 1), 0);
assertEquals(36, m.get(2, 0), 0);
assertEquals(38, m.get(2, 2), 0);
m = new Matrix(t, new int[] {1, 0, 0}, new int[] {1, 4, 4});
assertEquals(26, m.get(0, 0), 0);
assertEquals(27, m.get(0, 1), 0);
assertEquals(36, m.get(2, 0), 0);
assertEquals(38, m.get(2, 2), 0);
m = new Matrix(t, new int[] {0, 0, 1}, new int[] {4, 4, 1});
assertEquals(2, m.get(0, 0), 0);
assertEquals(7, m.get(0, 1), 0);
assertEquals(12, m.get(0, 2), 0);
assertEquals(27, m.get(1, 0), 0);
assertEquals(32, m.get(1, 1), 0);
assertEquals(37, m.get(1, 2), 0);
m = new Matrix(t, new int[] {2, 2, 1}, new int[] {3, 3, 1});
assertEquals(62, m.get(0, 0), 0);
assertEquals(67, m.get(0, 1), 0);
assertEquals(92, m.get(1, 1), 0);
m = new Matrix(4, 4);
for (int i = 0; i < m.getElements().length; i++) {
m.getElements()[i] = i + 1;
}
Matrix m2 = new Matrix(m, new int[] {1,1}, new int[] {2, 2});
assertEquals(6, m2.get(0, 0), 0);
assertEquals(7, m2.get(0, 1), 0);
assertEquals(10, m2.get(1, 0), 0);
assertEquals(11, m2.get(1, 1), 0);
}
}