public void TestNetworkSumOutputPort() { var multipliers = new Dictionary <int, IReceptiveField>(); multipliers[0] = new MulReceptiveField(0.0, 1.0); multipliers[1] = new MulReceptiveField(1.0, 1.0); multipliers[2] = new MulReceptiveField(2.0, 1.0); multipliers[3] = new MulReceptiveField(3.0, 1.0); multipliers[4] = new MulReceptiveField(4.0, 1.0); multipliers[5] = new MulReceptiveField(5.0, 1.0); multipliers[6] = new MulReceptiveField(6.0, 1.0); multipliers[7] = new MulReceptiveField(7.0, 1.0); multipliers[8] = new MulReceptiveField(8.0, 1.0); multipliers[9] = new MulReceptiveField(9.0, 1.0); // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 // 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 var arr = Enumerable.Range(0, 10) .Select(i => (double)(i % 2) * 30.0) .ToArray(); Assert.AreEqual(arr.Length, multipliers.Count); var port = new NetworkSumOutputPort(arr, multipliers); var sum = port.Get(); Assert.AreEqual(25.0, sum); }
public void TestNetworkSumOutputPort() { var multipliers = new Dictionary<int, IReceptiveField>(); multipliers[0] = new MulReceptiveField(0.0, 1.0); multipliers[1] = new MulReceptiveField(1.0, 1.0); multipliers[2] = new MulReceptiveField(2.0, 1.0); multipliers[3] = new MulReceptiveField(3.0, 1.0); multipliers[4] = new MulReceptiveField(4.0, 1.0); multipliers[5] = new MulReceptiveField(5.0, 1.0); multipliers[6] = new MulReceptiveField(6.0, 1.0); multipliers[7] = new MulReceptiveField(7.0, 1.0); multipliers[8] = new MulReceptiveField(8.0, 1.0); multipliers[9] = new MulReceptiveField(9.0, 1.0); // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 // 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 var arr = Enumerable.Range(0, 10) .Select(i => (double)(i % 2) * 30.0) .ToArray(); Assert.AreEqual(arr.Length, multipliers.Count); var port = new NetworkSumOutputPort(arr, multipliers); var sum = port.Get(); Assert.AreEqual(25.0, sum); }
public static NetworkPorts FromGenotype(NEAT.Genotype genotype) { var neuronGenes = genotype.NeuronGenes.ToList(); var synapseGenes = genotype.SynapseGenes.ToList(); var network = new Neural.Network(20ul); var upperNeurons = new Dictionary <int, IReceptiveField>(); var lowerNeurons = new Dictionary <int, IReceptiveField>(); var positionNeurons = new Dictionary <int, IReceptiveField>(); var speedNeurons = new Dictionary <int, IReceptiveField>(); foreach (var neuronGene in neuronGenes) { float a = NumberHelper.Scale(neuronGene.a, 0.02f, 0.1f); // 0.1 float b = NumberHelper.Scale(neuronGene.b, 0.2f, 0.25f); // 0.2 float c = NumberHelper.Scale(neuronGene.c, -65.0f, -50.0f); // -65.0 float d = NumberHelper.Scale(neuronGene.d, 0.05f, 8.0f); // 2.0 try { var id = (int)network.AddNeuron(Neural.IzhikevichConfig.Of(a, b, c, d)); var mean = 0.0f; var sigma = 0.0f; switch (neuronGene.type) { case NeuronType.UpperNeuron: mean = NumberHelper.Scale(neuronGene.mean, -180.0f, 180.0f); sigma = NumberHelper.Scale(neuronGene.sigma, 0.0f, 180.0f); upperNeurons[id] = new SignReceptiveField(mean, sigma); break; case NeuronType.LowerNeuron: mean = NumberHelper.Scale(neuronGene.mean, -180.0f, 180.0f); sigma = NumberHelper.Scale(neuronGene.sigma, 0.0f, 180.0f); lowerNeurons[id] = new SignReceptiveField(mean, sigma); break; case NeuronType.PositionNeuron: mean = NumberHelper.Scale(neuronGene.mean, -12.0f, 12.0f); sigma = NumberHelper.Scale(neuronGene.sigma, 0.0f, 12.0f); positionNeurons[id] = new SignReceptiveField(mean, sigma); break; case NeuronType.SpeedNeuron: mean = NumberHelper.Scale(neuronGene.mean, -1.0f, 1.0f); sigma = NumberHelper.Scale(neuronGene.sigma, 0.0f, 1000.0f); speedNeurons[id] = new MulReceptiveField(mean, sigma); break; } } catch (Exception e) { Debug.LogException(e); } } // Connect each input neuron to the output neuron. foreach (var synapseGene in synapseGenes) { if (!synapseGene.isEnabled) { continue; } var fromNeuronId = neuronGenes.FindIndex(n => n.InnovationId == synapseGene.fromNeuronId); var toNeuronId = neuronGenes.FindIndex(n => n.InnovationId == synapseGene.toNeuronId); Assert.AreNotEqual(fromNeuronId, -1, "Must find from-neuron id"); Assert.AreNotEqual(toNeuronId, -1, "Must find to-neuron id"); float weight = NumberHelper.Scale(synapseGene.weight, -40.0f, 40.0f); try { network.AddSynapse((ulong)fromNeuronId, (ulong)toNeuronId, Neural.STDPConfig.Of(weight, -40.0f, 40.0f)); } catch (Exception e) { Debug.LogException(e); } } return(new NetworkPorts(network, upperNeurons, lowerNeurons, positionNeurons, speedNeurons)); }
public static NetworkPorts FromGenotype(NEAT.Genotype genotype) { var neuronGenes = genotype.NeuronGenes.ToList(); var synapseGenes = genotype.SynapseGenes.ToList(); var network = new Neural.Network(20ul); var upperNeurons = new Dictionary<int, IReceptiveField>(); var lowerNeurons = new Dictionary<int, IReceptiveField>(); var positionNeurons = new Dictionary<int, IReceptiveField>(); var speedNeurons = new Dictionary<int, IReceptiveField>(); foreach (var neuronGene in neuronGenes) { float a = NumberHelper.Scale(neuronGene.a, 0.02f, 0.1f); // 0.1 float b = NumberHelper.Scale(neuronGene.b, 0.2f, 0.25f); // 0.2 float c = NumberHelper.Scale(neuronGene.c, -65.0f, -50.0f); // -65.0 float d = NumberHelper.Scale(neuronGene.d, 0.05f, 8.0f); // 2.0 try { var id = (int)network.AddNeuron(Neural.IzhikevichConfig.Of(a, b, c, d)); var mean = 0.0f; var sigma = 0.0f; switch (neuronGene.type) { case NeuronType.UpperNeuron: mean = NumberHelper.Scale(neuronGene.mean, -180.0f, 180.0f); sigma = NumberHelper.Scale(neuronGene.sigma, 0.0f, 180.0f); upperNeurons[id] = new SignReceptiveField(mean, sigma); break; case NeuronType.LowerNeuron: mean = NumberHelper.Scale(neuronGene.mean, -180.0f, 180.0f); sigma = NumberHelper.Scale(neuronGene.sigma, 0.0f, 180.0f); lowerNeurons[id] = new SignReceptiveField(mean, sigma); break; case NeuronType.PositionNeuron: mean = NumberHelper.Scale(neuronGene.mean, -12.0f, 12.0f); sigma = NumberHelper.Scale(neuronGene.sigma, 0.0f, 12.0f); positionNeurons[id] = new SignReceptiveField(mean, sigma); break; case NeuronType.SpeedNeuron: mean = NumberHelper.Scale(neuronGene.mean, -1.0f, 1.0f); sigma = NumberHelper.Scale(neuronGene.sigma, 0.0f, 1000.0f); speedNeurons[id] = new MulReceptiveField(mean, sigma); break; } } catch (Exception e) { Debug.LogException(e); } } // Connect each input neuron to the output neuron. foreach (var synapseGene in synapseGenes) { if (!synapseGene.isEnabled) { continue; } var fromNeuronId = neuronGenes.FindIndex(n => n.InnovationId == synapseGene.fromNeuronId); var toNeuronId = neuronGenes.FindIndex(n => n.InnovationId == synapseGene.toNeuronId); Assert.AreNotEqual(fromNeuronId, -1, "Must find from-neuron id"); Assert.AreNotEqual(toNeuronId, -1, "Must find to-neuron id"); float weight = NumberHelper.Scale(synapseGene.weight, -40.0f, 40.0f); try { network.AddSynapse((ulong)fromNeuronId, (ulong)toNeuronId, Neural.STDPConfig.Of(weight, -40.0f, 40.0f)); } catch (Exception e) { Debug.LogException(e); } } return new NetworkPorts(network, upperNeurons, lowerNeurons, positionNeurons, speedNeurons); }