// MPS support on the Hive methods only #region Generate heterogenous genomes with z-stack // MPS NOT supported by this method private NeatGenome.NeatGenome generateMultiGenomeStack(INetwork network, List<float> stackCoordinates, bool normalizeWeights, bool adaptiveNetwork, bool modulatoryNet) { if (useMultiPlaneSubstrate) throw new Exception("MPS not implemented for these parameters"); uint numberOfAgents = (uint)stackCoordinates.Count; IActivationFunction activationFunction = HyperNEATParameters.substrateActivationFunction; ConnectionGeneList connections = new ConnectionGeneList((int)(numberOfAgents * (InputCount * HiddenCount) + numberOfAgents * (HiddenCount * OutputCount))); float[] coordinates = new float[5]; float output; uint connectionCounter = 0; float agentDelta = 2.0f / (numberOfAgents - 1); int iterations = 2 * (network.TotalNeuronCount - (network.InputNeuronCount + network.OutputNeuronCount)) + 1; uint totalOutputCount = OutputCount * numberOfAgents; uint totalInputCount = InputCount * numberOfAgents; uint totalHiddenCount = HiddenCount * numberOfAgents; uint sourceCount, targetCout; double weightRange = HyperNEATParameters.weightRange; double threshold = HyperNEATParameters.threshold; NeuronGeneList neurons; // SharpNEAT requires that the neuron list be in this order: bias|input|output|hidden neurons = new NeuronGeneList((int)(InputCount * numberOfAgents + OutputCount * numberOfAgents + HiddenCount * numberOfAgents)); // set up the input nodes for (uint a = 0; a < totalInputCount; a++) { neurons.Add(new NeuronGene(a, NeuronType.Input, ActivationFunctionFactory.GetActivationFunction("NullFn"))); } // set up the output nodes for (uint a = 0; a < totalOutputCount; a++) { neurons.Add(new NeuronGene(a + InputCount * numberOfAgents, NeuronType.Output, activationFunction)); } // set up the hidden nodes for (uint a = 0; a < totalHiddenCount; a++) { neurons.Add(new NeuronGene(a + InputCount * numberOfAgents + OutputCount * numberOfAgents, NeuronType.Hidden, activationFunction)); } uint agent = 0; float A = 0.0f, B = 0.0f, C = 0.0f, D = 0.0f, learningRate = 0.0f, modConnection; foreach (float stackCoordinate in stackCoordinates) { coordinates[4] = stackCoordinate; uint sourceID = uint.MaxValue, targetID = uint.MaxValue; NeuronGroup connectedNG; foreach (NeuronGroup ng in neuronGroups) { foreach (uint connectedTo in ng.ConnectedTo) { connectedNG = getNeuronGroup(connectedTo); sourceCount = 0; foreach (PointF source in ng.NeuronPositions) { //-----------------Get the bias of the source node switch (ng.GroupType) { case 0: sourceID = (agent * InputCount) + ng.GlobalID + sourceCount; break; //Input case 1: sourceID = totalInputCount + (agent * OutputCount) + ng.GlobalID + sourceCount; break; //Output case 2: sourceID = totalInputCount + totalOutputCount + (agent * HiddenCount) + ng.GlobalID + sourceCount; break; //Hidden } coordinates[0] = source.X; coordinates[1] = source.Y; coordinates[2] = 0.0f; coordinates[3] = 0.0f; network.ClearSignals(); network.SetInputSignals(coordinates); network.RecursiveActivation();//network.MultipleSteps(iterations); neurons[(int)sourceID].Bias = (float)(network.GetOutputSignal(1) * weightRange); //---------------------------- targetCout = 0; foreach (PointF target in connectedNG.NeuronPositions) { switch (ng.GroupType) { case 0: sourceID = (agent * InputCount) + ng.GlobalID + sourceCount; break; //Input case 1: sourceID = totalInputCount + (agent * OutputCount) + ng.GlobalID + sourceCount; break; //Output case 2: sourceID = totalInputCount + totalOutputCount + (agent * HiddenCount) + ng.GlobalID + sourceCount; break; //Hidden } switch (connectedNG.GroupType) { case 0: targetID = (agent * InputCount) + connectedNG.GlobalID + targetCout; break; case 1: targetID = totalInputCount + (agent * OutputCount) + connectedNG.GlobalID + targetCout; break; case 2: targetID = totalInputCount + totalOutputCount + (agent * HiddenCount) + connectedNG.GlobalID + targetCout; break; } coordinates[0] = source.X; coordinates[1] = source.Y; coordinates[2] = target.X; coordinates[3] = target.Y; network.ClearSignals(); network.SetInputSignals(coordinates); network.RecursiveActivation();//network.MultipleSteps(iterations); output = network.GetOutputSignal(0); double leo = 0.0; if (adaptiveNetwork) { A = network.GetOutputSignal(2); B = network.GetOutputSignal(3); C = network.GetOutputSignal(4); D = network.GetOutputSignal(5); learningRate = network.GetOutputSignal(6); } if (modulatoryNet) { modConnection = network.GetOutputSignal(7); } else { modConnection = 0.0f; } if (useLeo) { threshold = 0.0; leo = network.GetOutputSignal(2); } if (!useLeo || leo > 0.0) if (Math.Abs(output) > threshold) { float weight = (float)(((Math.Abs(output) - (threshold)) / (1 - threshold)) * weightRange * Math.Sign(output)); //if (adaptiveNetwork) //{ // //If adaptive network set weight to small value // weight = 0.1f; //} connections.Add(new ConnectionGene(connectionCounter++, sourceID, targetID, weight, ref coordinates)); } //else //{ // Console.WriteLine("Not connected"); //} targetCout++; } sourceCount++; } } } agent++; } if (normalizeWeights) { normalizeWeightConnections(ref connections, neurons.Count); } SharpNeatLib.NeatGenome.NeatGenome sng = new SharpNeatLib.NeatGenome.NeatGenome(0, neurons, connections, (int)(totalInputCount), (int)(totalOutputCount)); sng.networkAdaptable = adaptiveNetwork; sng.networkModulatory = modulatoryNet; return sng; }
// NOTE: Multi-Plane Substrates ARE supported by this method! private NeatGenome.NeatGenome generateHiveBrainGenomeStack(INetwork network, List<float> stackCoordinates, bool normalizeWeights, bool adaptiveNetwork, bool modulatoryNet,bool ct) { //bool relativeCoordinate = false; bool oneWay = false; bool homogeneous = false ; Dictionary<String, float> weights = new Dictionary<String, float>(); float timeConstantMin = 0.1f; float timeConstantMax = 2.0f; uint numberOfAgents = (uint)stackCoordinates.Count; IActivationFunction activationFunction = HyperNEATParameters.substrateActivationFunction; ConnectionGeneList connections = new ConnectionGeneList((int)(numberOfAgents * (InputCount * HiddenCount) + numberOfAgents * (HiddenCount * OutputCount))); // TODO: Perhaps get an exact count of connections in the constructor and use that value here? float[] coordinates = new float[5]; //JUSTIN: Used to be 6 coordinates, zstack was duplicated for relativeCoordinate hyjinx. fixed it. // Inputs to the CPPN: [srcX, srcY, tgX, tgY, zstack] float output; uint connectionCounter = 0; float agentDelta = 2.0f / (numberOfAgents - 1); int iterations = 2 * (network.TotalNeuronCount - (network.InputNeuronCount + network.OutputNeuronCount)) + 1; uint totalOutputCount = OutputCount * numberOfAgents; uint totalInputCount = InputCount * numberOfAgents; uint totalHiddenCount = HiddenCount * numberOfAgents; uint sourceCount, targetCout; double weightRange = HyperNEATParameters.weightRange; double threshold = HyperNEATParameters.threshold; NeuronGeneList neurons; // SharpNEAT requires that the neuron list be in this order: bias|input|output|hidden neurons = new NeuronGeneList((int)(InputCount * numberOfAgents + OutputCount * numberOfAgents + HiddenCount * numberOfAgents)); // set up the input nodes for (uint a = 0; a < totalInputCount; a++) { neurons.Add(new NeuronGene(a, NeuronType.Input, ActivationFunctionFactory.GetActivationFunction("NullFn"))); } // set up the output nodes for (uint a = 0; a < totalOutputCount; a++) { neurons.Add(new NeuronGene(a + InputCount * numberOfAgents, NeuronType.Output, activationFunction)); } // set up the hidden nodes for (uint a = 0; a < totalHiddenCount; a++) { neurons.Add(new NeuronGene(a + InputCount * numberOfAgents + OutputCount * numberOfAgents, NeuronType.Hidden, activationFunction)); } uint agent = 0; float A = 0.0f, B = 0.0f, C = 0.0f, D = 0.0f, learningRate = 0.0f, modConnection; // CPPN Outputs: [ Weights ] [ Biases ] // When using multi-plane substrates, there will be multiple Weight and Bias outputs. // There is a Weight output for every plane-to-plane connection (including a plane connected to itself, as in regular substrates) // There is a Bias output for every plane // Since "regular substrates" only have 1 plane, they only have 1 Weight and 1 Bias output. MP substrates have more. :) int numPlanes = planes.Count; int numPlaneConnections = planesConnected.Count; int computedIndex; foreach (float stackCoordinate in stackCoordinates) { coordinates[4] = stackCoordinate; //coordinates[4] = homogeneous ? 0 : stackCoordinate;//-1 ? -1 : 0;//0;//stackCoordinate; //coordinates[5] = stackCoordinate; uint sourceID = uint.MaxValue, targetID = uint.MaxValue; NeuronGroup connectedNG; foreach (NeuronGroup ng in neuronGroups) { foreach (uint connectedTo in ng.ConnectedTo) { /*if (!relativeCoordinate) coordinates[5] = stackCoordinate; else //USE RELATIVE coordinates[5] = 0;//*/ connectedNG = getNeuronGroup(connectedTo); sourceCount = 0; foreach (PointF source in ng.NeuronPositions) { //-----------------Get the bias of the source node /* switch (ng.GroupType) { case 0: sourceID = (agent * InputCount) + ng.GlobalID + sourceCount; break; //Input case 1: sourceID = totalInputCount + (agent * OutputCount) + ng.GlobalID + sourceCount; break; //Output case 2: sourceID = totalInputCount + totalOutputCount + (agent * HiddenCount) + ng.GlobalID + sourceCount; break; //Hidden } coordinates[0] = source.X; coordinates[1] = source.Y; coordinates[2] = 0.0f; coordinates[3] = 0.0f; network.ClearSignals(); network.SetInputSignals(coordinates); network.RecursiveActivation();//network.MultipleSteps(iterations); neurons[(int)sourceID].Bias = (float)(network.GetOutputSignal(1) * weightRange); if (ct) { neurons[(int)sourceID].TimeConstant = 0.01f + ((((float)network.GetOutputSignal(2) + 1.0f) / 2.0f) * .05f); System.Diagnostics.Debug.Assert(neurons[(int)sourceID].TimeConstant > 0); }*/ //---------------------------- targetCout = 0; foreach (PointF target in connectedNG.NeuronPositions) { switch (ng.GroupType) { case 0: sourceID = (agent * InputCount) + ng.GlobalID + sourceCount; break; //Input case 1: sourceID = totalInputCount + (agent * OutputCount) + ng.GlobalID + sourceCount; break; //Output case 2: sourceID = totalInputCount + totalOutputCount + (agent * HiddenCount) + ng.GlobalID + sourceCount; break; //Hidden } switch (connectedNG.GroupType) { case 0: targetID = (agent * InputCount) + connectedNG.GlobalID + targetCout; break; case 1: targetID = totalInputCount + (agent * OutputCount) + connectedNG.GlobalID + targetCout; break; case 2: targetID = totalInputCount + totalOutputCount + (agent * HiddenCount) + connectedNG.GlobalID + targetCout; break; } //-----------------Get the bias of the target node coordinates[0] = target.X; coordinates[1] = target.Y; coordinates[2] = 0.0f; coordinates[3] = 0.0f; //String s = arrayToString(coordinates); //if (weights.ContainsKey(s)) // neurons[(int)targetID].Bias = weights[s]; //else { network.ClearSignals(); network.SetInputSignals(coordinates); network.RecursiveActivation();//network.MultipleSteps(iterations); computedIndex = numPlaneConnections + planes.IndexOf(connectedNG.Plane); //neurons[(int)targetID].Bias = (float)(network.GetOutputSignal(1) * weightRange); neurons[(int)targetID].Bias = (float)(network.GetOutputSignal(computedIndex) * weightRange); //weights.Add(s,neurons[(int)targetID].Bias); } if (ct) { neurons[(int)targetID].TimeConstant = timeConstantMin + ((((float)network.GetOutputSignal(2) + 1.0f) / 2.0f) * (timeConstantMax - timeConstantMin)); System.Diagnostics.Debug.Assert(neurons[(int)targetID].TimeConstant > 0); } //---------------------------- coordinates[0] = source.X; coordinates[1] = source.Y; coordinates[2] = target.X; coordinates[3] = target.Y; //Console.WriteLine(arrayToString(coordinates)); //if(weights.ContainsKey(s)) // output = weights[s]; //else { network.ClearSignals(); network.SetInputSignals(coordinates); network.RecursiveActivation();//network.MultipleSteps(iterations); computedIndex = indexOfPlaneConnection(ng.Plane, connectedNG.Plane); //output = network.GetOutputSignal(0); output = network.GetOutputSignal(computedIndex); //weights.Add(s, output); } double leo = 0.0; if (adaptiveNetwork) { A = network.GetOutputSignal(2); B = network.GetOutputSignal(3); C = network.GetOutputSignal(4); D = network.GetOutputSignal(5); learningRate = network.GetOutputSignal(6); } if (modulatoryNet) { modConnection = network.GetOutputSignal(7); } else { modConnection = 0.0f; } if (useLeo) { threshold = 0.0; leo = network.GetOutputSignal(2); } if (!useLeo || leo > 0.0) if (Math.Abs(output) > threshold) { float weight = (float)(((Math.Abs(output) - (threshold)) / (1 - threshold)) * weightRange * Math.Sign(output)); //if (adaptiveNetwork) //{ // //If adaptive network set weight to small value // weight = 0.1f; //} connections.Add(new ConnectionGene(connectionCounter++, sourceID, targetID, weight, ref coordinates)); } //else //{ // Console.WriteLine("Not connected"); //} targetCout++; } sourceCount++; } } foreach (uint connectedTo in ng.HiveConnectedTo) { bool wrapAround = true; for (uint agentConnect = 0; agentConnect < stackCoordinates.Count; agentConnect++) { //Make sure we're not making a recurrent connection on the same agent //if (agentConnect == agent) // continue; // else if ((agent == stackCoordinates.Count - 1 && agentConnect == 0) || (agent == 0 && agentConnect == stackCoordinates.Count - 1)) // ;//agentConnect = 0; if (agent != 0 && agent != stackCoordinates.Count - 1) continue; //if (agent == 1) // continue; //if (agentConnect != 0 ) // continue; //Limits connections to only neighbors. Good? //if (!((agent == 0 || agentConnect >= agent - 1) && agentConnect <= agent + 1)) // continue; //if (agentConnect > agent + 1 || agentConnect < agent - 1) // continue; if (oneWay) { //ONE-WAY if (agentConnect > agent + 1 || agentConnect < agent) continue; } /*if (!relativeCoordinate) //USE THE Z COORDINATE coordinates[5] = stackCoordinates[(int)agentConnect]; else //USE THE RELATIVE COORDINATE coordinates[5] = agentConnect > agent ? 1 : -1; //*/ //WRAP AROUND /*if (agent == stackCoordinates.Count - 1 && agentConnect == 0) coordinates[5] = 1; else if (agent == 0 && agentConnect == stackCoordinates.Count - 1) coordinates[5] = -1; */ connectedNG = getNeuronGroup(connectedTo); sourceCount = 0; foreach (PointF source in ng.NeuronPositions) { //-----------------Get the bias of the source node /* switch (ng.GroupType) { case 0: sourceID = (agent * InputCount) + ng.GlobalID + sourceCount; break; //Input case 1: sourceID = totalInputCount + (agent * OutputCount) + ng.GlobalID + sourceCount; break; //Output case 2: sourceID = totalInputCount + totalOutputCount + (agent * HiddenCount) + ng.GlobalID + sourceCount; break; //Hidden } coordinates[0] = source.X; coordinates[1] = source.Y; coordinates[2] = 0.0f; coordinates[3] = 0.0f; network.ClearSignals(); network.SetInputSignals(coordinates); network.RecursiveActivation();//network.MultipleSteps(iterations); neurons[(int)sourceID].Bias = (float)(network.GetOutputSignal(1) * weightRange); if (ct) { neurons[(int)sourceID].TimeConstant = 0.01f + ((((float)network.GetOutputSignal(2) + 1.0f) / 2.0f) * .05f); System.Diagnostics.Debug.Assert(neurons[(int)sourceID].TimeConstant > 0); }*/ //---------------------------- targetCout = 0; foreach (PointF target in connectedNG.NeuronPositions) { /*if ((source.X != target.X)) { targetCout++; continue; }*/ if (/*source.X!= target.X ||*/ target.X != coordinates[4])// || source.X!= coordinates[4]) { targetCout++; continue; } /* if (agent != 0 && agent != stackCoordinates.Count - 1) { if(agentConnect != 0 && agentConnect != stackCoordinates.Count - 1) { targetCout++; continue; } }*/ switch (ng.GroupType) { case 0: sourceID = (agent * InputCount) + ng.GlobalID + sourceCount; break; //Input case 1: sourceID = totalInputCount + (agent * OutputCount) + ng.GlobalID + sourceCount; break; //Output case 2: sourceID = totalInputCount + totalOutputCount + (agent * HiddenCount) + ng.GlobalID + sourceCount; break; //Hidden } switch (connectedNG.GroupType) { case 0: targetID = (agentConnect * InputCount) + connectedNG.GlobalID + targetCout; break; case 1: targetID = totalInputCount + (agentConnect * OutputCount) + connectedNG.GlobalID + targetCout; break; case 2: targetID = totalInputCount + totalOutputCount + (agentConnect * HiddenCount) + connectedNG.GlobalID + targetCout; break; } //-----------------Get the bias of the target node coordinates[0] = target.X; coordinates[1] = target.Y; coordinates[2] = 0.0f; coordinates[3] = 0.0f; //String s = arrayToString(coordinates); //if (weights.ContainsKey(s)) // neurons[(int)targetID].Bias = weights[s]; //else { network.ClearSignals(); network.SetInputSignals(coordinates); network.RecursiveActivation();//network.MultipleSteps(iterations); computedIndex = numPlaneConnections + planes.IndexOf(connectedNG.Plane); //neurons[(int)targetID].Bias = (float)(network.GetOutputSignal(1) * weightRange); neurons[(int)targetID].Bias = (float)(network.GetOutputSignal(computedIndex) * weightRange); // weights.Add(s, neurons[(int)targetID].Bias); } if (ct) { neurons[(int)targetID].TimeConstant = timeConstantMin + ((((float)network.GetOutputSignal(2) + 1.0f) / 2.0f) * (timeConstantMax - timeConstantMin)); System.Diagnostics.Debug.Assert(neurons[(int)targetID].TimeConstant > 0); } //---------------------------- coordinates[0] = source.X; coordinates[1] = source.Y; coordinates[2] = target.X; coordinates[3] = target.Y; //s = arrayToString(coordinates); //if (weights.ContainsKey(s)) // output = weights[s]; //else { network.ClearSignals(); network.SetInputSignals(coordinates); network.RecursiveActivation();//network.MultipleSteps(iterations); computedIndex = indexOfPlaneConnection(ng.Plane, connectedNG.Plane); //output = network.GetOutputSignal(0); output = network.GetOutputSignal(computedIndex); // weights.Add(s, output); } double leo = 0.0; if (adaptiveNetwork) { A = network.GetOutputSignal(2); B = network.GetOutputSignal(3); C = network.GetOutputSignal(4); D = network.GetOutputSignal(5); learningRate = network.GetOutputSignal(6); } if (modulatoryNet) { modConnection = network.GetOutputSignal(7); } else { modConnection = 0.0f; } if (useLeo) { threshold = 0.0; leo = network.GetOutputSignal(2); } if (!useLeo || leo > 0.0) if (Math.Abs(output) > threshold) { float weight = (float)(((Math.Abs(output) - (threshold)) / (1 - threshold)) * weightRange * Math.Sign(output)); //if (adaptiveNetwork) //{ // //If adaptive network set weight to small value // weight = 0.1f; //} connections.Add(new ConnectionGene(connectionCounter++, sourceID, targetID, weight, ref coordinates, true)); } //else //{ // Console.WriteLine("Not connected"); //} targetCout++; } sourceCount++; } } } } agent++; } if (normalizeWeights) { normalizeWeightConnections(ref connections, neurons.Count); } SharpNeatLib.NeatGenome.NeatGenome sng = new SharpNeatLib.NeatGenome.NeatGenome(0, neurons, connections, (int)(totalInputCount), (int)(totalOutputCount)); sng.networkAdaptable = adaptiveNetwork; sng.networkModulatory = modulatoryNet; return sng; }
// NOTE: Multi-Plane Substrates ARE MAYBE supported by this method! private NeatGenome.NeatGenome generateHomogeneousGenome(INetwork network, bool normalizeWeights, bool adaptiveNetwork,bool modulatoryNet) { IActivationFunction activationFunction = HyperNEATParameters.substrateActivationFunction; ConnectionGeneList connections = new ConnectionGeneList((int)((InputCount * HiddenCount) + (HiddenCount * OutputCount))); float[] coordinates = new float[4]; //JUSTIN: CHANGE THIS BACK TO [4]!!! float output; uint connectionCounter = 0; int iterations = 2 * (network.TotalNeuronCount - (network.InputNeuronCount + network.OutputNeuronCount)) + 1; uint totalOutputCount = OutputCount; uint totalInputCount = InputCount; uint totalHiddenCount = HiddenCount; uint sourceCount, targetCout; double weightRange = HyperNEATParameters.weightRange; double threshold = HyperNEATParameters.threshold; NeuronGeneList neurons; // SharpNEAT requires that the neuron list be in this order: bias|input|output|hidden neurons = new NeuronGeneList((int)(InputCount + OutputCount + HiddenCount)); // set up the input nodes for (uint a = 0; a < totalInputCount; a++) { neurons.Add(new NeuronGene(a, NeuronType.Input, ActivationFunctionFactory.GetActivationFunction("NullFn"))); } // set up the output nodes for (uint a = 0; a < totalOutputCount; a++) { neurons.Add(new NeuronGene(a + InputCount, NeuronType.Output, activationFunction)); } // set up the hidden nodes for (uint a = 0; a < totalHiddenCount; a++) { neurons.Add(new NeuronGene(a + InputCount + OutputCount, NeuronType.Hidden, activationFunction)); } // CPPN Outputs: [ Weights ] [ Biases ] // When using multi-plane substrates, there will be multiple Weight and Bias outputs. // There is a Weight output for every plane-to-plane connection (including a plane connected to itself, as in regular substrates) // There is a Bias output for every plane // Since "regular substrates" only have 1 plane, they only have 1 Weight and 1 Bias output. MP substrates have more. :) int numPlanes = planes.Count; int numPlaneConnections = planesConnected.Count; int computedIndex; uint sourceID = uint.MaxValue, targetID = uint.MaxValue; NeuronGroup connectedNG; foreach (NeuronGroup ng in neuronGroups) { foreach (uint connectedTo in ng.ConnectedTo) { connectedNG = getNeuronGroup(connectedTo); sourceCount = 0; foreach (PointF source in ng.NeuronPositions) { //-----------------Get the bias of the source node /*switch (ng.GroupType) { case 0: sourceID = ng.GlobalID + sourceCount; break; //Input case 1: sourceID = totalInputCount + ng.GlobalID + sourceCount; break; //Output case 2: sourceID = totalInputCount + totalOutputCount + ng.GlobalID + sourceCount; break; //Hidden } coordinates[0] = source.X; coordinates[1] = source.Y; coordinates[2] = 0.0f; coordinates[3] = 0.0f; network.ClearSignals(); network.SetInputSignals(coordinates); network.RecursiveActivation();//network.MultipleSteps(iterations); neurons[(int)sourceID].Bias = (float)(network.GetOutputSignal(1) * weightRange); //*///---------------------------- targetCout = 0; foreach (PointF target in connectedNG.NeuronPositions) { switch (ng.GroupType) { case 0: sourceID = ng.GlobalID + sourceCount; break; //Input case 1: sourceID = totalInputCount + ng.GlobalID + sourceCount; break; //Output case 2: sourceID = totalInputCount + totalOutputCount + ng.GlobalID + sourceCount; break; //Hidden } switch (connectedNG.GroupType) { case 0: targetID = connectedNG.GlobalID + targetCout; break; case 1: targetID = totalInputCount + connectedNG.GlobalID + targetCout; break; case 2: targetID = totalInputCount + totalOutputCount + connectedNG.GlobalID + targetCout; break; } //-----------------Get the bias of the target node coordinates[0] = target.X; coordinates[1] = target.Y; coordinates[2] = 0.0f; coordinates[3] = 0.0f; //coordinates[4] = 0.0f; coordinates[5] = 0.0f; //JUSTIN: REMOVE THIS!!! //String s = arrayToString(coordinates); //if (weights.ContainsKey(s)) // neurons[(int)targetID].Bias = weights[s]; //else { network.ClearSignals(); network.SetInputSignals(coordinates); network.RecursiveActivation();//network.MultipleSteps(iterations); computedIndex = numPlaneConnections + planes.IndexOf(connectedNG.Plane); //neurons[(int)targetID].Bias = (float)(network.GetOutputSignal(1) * weightRange); neurons[(int)targetID].Bias = (float)(network.GetOutputSignal(computedIndex) * weightRange); //weights.Add(s,neurons[(int)targetID].Bias); } //---------------------------- coordinates[0] = source.X; coordinates[1] = source.Y; coordinates[2] = target.X; coordinates[3] = target.Y; //coordinates[4] = source.X - target.X; coordinates[5] = source.Y - target.Y; //JUSTIN: REMOVE THIS!!! network.ClearSignals(); network.SetInputSignals(coordinates); network.RecursiveActivation();//network.MultipleSteps(iterations); computedIndex = indexOfPlaneConnection(ng.Plane, connectedNG.Plane); //output = network.GetOutputSignal(0); output = network.GetOutputSignal(computedIndex); if (Math.Abs(output) > threshold) { float weight = (float)(((Math.Abs(output) - (threshold)) / (1 - threshold)) * weightRange * Math.Sign(output)); connections.Add(new ConnectionGene(connectionCounter++, sourceID, targetID, weight, ref coordinates)); } //else //{ // Console.WriteLine("Not connected"); //} targetCout++; } sourceCount++; } } } if (normalizeWeights) { normalizeWeightConnections(ref connections, neurons.Count); } NeatGenome.NeatGenome gn = new SharpNeatLib.NeatGenome.NeatGenome(0, neurons, connections, (int)(totalInputCount), (int)(totalOutputCount)); gn.networkAdaptable = adaptiveNetwork; gn.networkModulatory = modulatoryNet; return gn; }