colgreen/sharpneat

Out of bounds SignalArray access

Closed this issue · 2 comments

I'm creating my own CreateGenomeDecoder and getting Out of bounds SignalArray access in CreateNetworkDefinition during
// Read bias connection weight from output 1.
double weight = outputSignalArr[1];

Is that a bug or I'm doing something wrong?

I've changed the index to 0 and it seems to be working. Is this a bug????
double weight = outputSignalArr[1====>0];

Here's my code

    public override IGenomeDecoder<NeatGenome, IBlackBox> CreateGenomeDecoder()
    {
        uint neuronID = 1;

        SubstrateNodeSet inputLayer = new SubstrateNodeSet(1 + 3 + CHART_HEIGHT * CHART_WIDTH);

        AddNode(inputLayer, neuronID++, -1, 0, -1.0); //
        AddNode(inputLayer, neuronID++, 0, 0, -1.0);
        AddNode(inputLayer, neuronID++, +1, 0, -1.0);

        AddNeuralGrid(inputLayer, CHART_WIDTH, CHART_HEIGHT, ref neuronID, -1);

        //-- Output layer node.
        SubstrateNodeSet outputLayer = new SubstrateNodeSet(1);
        AddNode(outputLayer, neuronID++, 0, 0, +1.0);
        AddNode(outputLayer, neuronID++, 0, 0, +1.0);


        SubstrateNodeSet HiddenInputLayer = new SubstrateNodeSet(1 + 3 + CHART_HEIGHT * CHART_WIDTH);
        AddNode(HiddenInputLayer, neuronID++, 0, 0, -1.0); //feedback fromoutput here


        //-- Hidden layer nodes.
        SubstrateNodeSet h1Layer = new SubstrateNodeSet(4);
        AddNeuralGrid(h1Layer, 5, 5, ref neuronID, 0);



        List<SubstrateNodeSet> nodeSetList = new List<SubstrateNodeSet>(4);
        nodeSetList.Add(inputLayer); //0
        nodeSetList.Add(outputLayer); //1
        //nodeSetList.Add(h1Layer);  //2
        //nodeSetList.Add(HiddenInputLayer); //3

        // Define a connection mapping from the input layer to the output layer. Using INDEXES
        List<NodeSetMapping> nodeSetMappingList = new List<NodeSetMapping>(4);
        nodeSetMappingList.Add(NodeSetMapping.Create(0, 1/*2*/, (double?)null));
        //nodeSetMappingList.Add(NodeSetMapping.Create(2, 1, (double?)null));
        //nodeSetMappingList.Add(NodeSetMapping.Create(3, 2, (double?)null));
        //nodeSetMappingList.Add(NodeSetMapping.Create(1, 3, (double?)null));

        // Construct the substrate using a steepened sigmoid as the phenome's
        // activation function. All weights under 0.2 will not generate 
        // connections in the final phenome.
        Substrate substrate = new Substrate(nodeSetList,
            CreateLibraryCppn(),
            0, 0.2, 5, nodeSetMappingList);

        // Create genome decoder. Decodes to a neural network packaged with
        // an activation scheme that defines a fixed number of activations per evaluation.
        IGenomeDecoder<NeatGenome, IBlackBox> genomeDecoder =
            new HyperNeatDecoder(substrate, _activationSchemeCppn, _activationScheme, false);

        return genomeDecoder;
    }

Hi. It's hard to say without seeing the full source code. However, at first glance it looks like you are creating an output layer with one node, but then adding two nodes to it(?):

    //-- Output layer node.
    SubstrateNodeSet outputLayer = new SubstrateNodeSet(1);
    AddNode(outputLayer, neuronID++, 0, 0, +1.0);
    AddNode(outputLayer, neuronID++, 0, 0, +1.0);

But that looks like two nodes with an identical position (depending on what AddNodeis doing). So do you require one or two output nodes?

@robertvo have you resolved the problem?