public void Setup(NeuralNetwork nn, NeuralNetworkContext context, NeuralNetworkFullContext fullCtx, NeuralNetworkDerivativeMemory derivMem) { //initialize memory buffers state = new float[nn.hiddenLayers.Length][]; weights = new float[nn.hiddenLayers.Length + 1][]; biases = new float[nn.hiddenLayers.Length + 1][]; buf = new float[nn.hiddenLayers.Length + 1][]; recurrBuf = new float[nn.hiddenLayers.Length][]; biasMems = derivMem.biasMems; weightMems = derivMem.weightMems; recurrWeightMems = derivMem.recurrWeightMems; recurrWeights = new float[nn.hiddenLayers.Length][]; derivativeMemory = derivMem; for (int i = 0; i < nn.hiddenLayers.Length; i++) { state[i] = new float[nn.hiddenLayers[i].numberOfNeurons]; weights[i] = nn.hiddenConnections[i].weights; biases[i] = nn.hiddenLayers[i].biases; if (i == 0) { buf[i] = context.inputData; } else { buf[i] = fullCtx.hiddenBuffer[i - 1]; } if (nn.hiddenLayers[i].recurring) { recurrWeights[i] = nn.hiddenRecurringConnections[i].weights; recurrBuf[i] = fullCtx.hiddenRecurringBuffer[i]; } } int lid = nn.hiddenLayers.Length; weights[lid] = nn.outputConnection.weights; biases[lid] = nn.outputLayer.biases; if (lid > 0) { buf[lid] = fullCtx.hiddenBuffer[lid - 1]; } else { buf[lid] = context.inputData; } }