package com.heatonresearch.aifh.ann;
import com.heatonresearch.aifh.AIFH;
import com.heatonresearch.aifh.AIFHError;
import com.heatonresearch.aifh.ann.activation.ActivationReLU;
import com.heatonresearch.aifh.ann.activation.ActivationSigmoid;
import com.heatonresearch.aifh.ann.activation.ActivationSoftMax;
import com.heatonresearch.aifh.ann.randomize.RangeRandomizeNetwork;
import com.heatonresearch.aifh.randomize.LinearCongruentialRandom;
import org.junit.Assert;
import org.junit.Test;
public class TestBasicNetwork {
public static BasicNetwork buildSimpleXOR() {
BasicNetwork network = new BasicNetwork();
network.addLayer(new BasicLayer(null,true,2));
network.addLayer(new BasicLayer(new ActivationSigmoid(),true,3));
network.addLayer(new BasicLayer(new ActivationSigmoid(),false,1));
network.finalizeStructure();
RangeRandomizeNetwork randomize = new RangeRandomizeNetwork();
randomize.setRnd(new LinearCongruentialRandom(10));
randomize.randomize(network);
return network;
}
@Test
public void testWeightAccess() {
BasicNetwork network = TestBasicNetwork.buildSimpleXOR();
// layer 0
Assert.assertEquals(-0.48463710059519793,network.getWeight(0,0,0), AIFH.DEFAULT_PRECISION);
Assert.assertEquals(0.8420570357334933,network.getWeight(0,0,1), AIFH.DEFAULT_PRECISION);
Assert.assertEquals(-0.5286518143323836,network.getWeight(0,0,2), AIFH.DEFAULT_PRECISION);
Assert.assertEquals(-0.9318070094873679,network.getWeight(0,1,0), AIFH.DEFAULT_PRECISION);
Assert.assertEquals(-0.38185835475610996,network.getWeight(0,1,1), AIFH.DEFAULT_PRECISION);
Assert.assertEquals(-0.5337936066868234,network.getWeight(0,1,2), AIFH.DEFAULT_PRECISION);
Assert.assertEquals(-0.38468537605011033,network.getWeight(0,2,0), AIFH.DEFAULT_PRECISION);
Assert.assertEquals(-0.06280032523507262,network.getWeight(0,2,1), AIFH.DEFAULT_PRECISION);
Assert.assertEquals(-0.7822212804533125,network.getWeight(0,2,2), AIFH.DEFAULT_PRECISION);
// layer 1
Assert.assertEquals(0.13864904435785697,network.getWeight(1,0,0), AIFH.DEFAULT_PRECISION);
Assert.assertEquals(-0.1389734035215744,network.getWeight(1,1,0), AIFH.DEFAULT_PRECISION);
Assert.assertEquals(0.34318625259753,network.getWeight(1,2,0), AIFH.DEFAULT_PRECISION);
}
@Test
public void testWeightRange() {
BasicNetwork network = TestBasicNetwork.buildSimpleXOR();
// Layer too big
try {
network.getWeight(2, 0, 0);
Assert.assertTrue(false);
} catch(AIFHError ex) {
Assert.assertNotNull(ex);
}
// From neuron too big
try {
network.getWeight(0, 3, 0);
Assert.assertTrue(false);
} catch(AIFHError ex) {
Assert.assertNotNull(ex);
}
// To neuron too big
try {
network.getWeight(0, 0, 4);
Assert.assertTrue(false);
} catch(AIFHError ex) {
Assert.assertNotNull(ex);
}
}
@Test
public void testCalculate() {
BasicNetwork network = TestBasicNetwork.buildSimpleXOR();
double[] out1 = network.computeRegression(new double[] {0.0, 0.0});
Assert.assertEquals(0.34688637738116557, out1[0], AIFH.DEFAULT_PRECISION);
double[] out2 = network.computeRegression(new double[] {1.0, 0.0});
Assert.assertEquals(0.32943376685512565, out2[0], AIFH.DEFAULT_PRECISION);
Assert.assertEquals(1,out2.length);
}
@Test
public void testNeuronStructure() {
Layer inputLayer,hidden1Layer,hidden2Layer,hidden3Layer,outputLayer;
BasicNetwork network = new BasicNetwork();
network.addLayer(inputLayer = new BasicLayer(null,true,90));
network.addLayer(hidden1Layer = new BasicLayer(new ActivationReLU(),true,256));
network.addLayer(hidden2Layer = new BasicLayer(new ActivationReLU(),true,128));
network.addLayer(hidden3Layer = new BasicLayer(new ActivationReLU(),true,64));
network.addLayer(outputLayer = new BasicLayer(new ActivationSoftMax(),false,10));
network.finalizeStructure();
Assert.assertEquals(91, inputLayer.getTotalCount());
Assert.assertEquals(257, hidden1Layer.getTotalCount());
Assert.assertEquals(129, hidden2Layer.getTotalCount());
Assert.assertEquals(65, hidden3Layer.getTotalCount());
Assert.assertEquals(10, outputLayer.getTotalCount());
Assert.assertEquals(0, outputLayer.getNeuronIndex());
Assert.assertEquals(10, hidden3Layer.getNeuronIndex());
Assert.assertEquals(75, hidden2Layer.getNeuronIndex());
Assert.assertEquals(204, hidden1Layer.getNeuronIndex());
Assert.assertEquals(0, outputLayer.getNeuronIndex());
}
}