public IntegerFastConcurrentNetwork(int biasNeuronCount, 
            int inputNeuronCount,
            int outputNeuronCount,
            int totalNeuronCount,
            IntegerFastConnection[] connectionArray)
        {
            this.biasNeuronCount = biasNeuronCount;
            this.inputNeuronCount = inputNeuronCount;
            this.totalInputNeuronCount = biasNeuronCount + inputNeuronCount;
            this.outputNeuronCount = outputNeuronCount;

            this.connectionArray = connectionArray;

            //----- Allocate the arrays that make up the neural network.
            // The neuron signals are initialised to 0 by default. Only bias nodes need setting to 1.
            neuronSignalArray = new int[totalNeuronCount];
            _neuronSignalArray = new int[totalNeuronCount];

            for(int i=0; i<biasNeuronCount; i++)
                neuronSignalArray[i] = 0x1000;
        }
		// This is a quick sort algorithm that manipulates FastConnection structures. Although this
		// is the same sorting technique used internally by Array.Sort this is approximately 10 times 
		// faster because it eliminates the need for boxing and unboxing of the structs.
		// So although this code could be replcaed by a single Array.Sort statement, the pay off
		// was though to be worth it.

		private static int CompareKeys(ref IntegerFastConnection a, ref IntegerFastConnection b)
		{
			int diff = a.sourceNeuronIdx - b.sourceNeuronIdx;
			if(diff==0)
			{
				// Secondary sort on targetNeuronIdx.
				return a.targetNeuronIdx - b.targetNeuronIdx;
			}
			else
			{
				return diff;
			}
		}