public NeuralNet(NeuralNetParameters parameters)
        {
            wagesBetweenInputAndFirstHiddenLayer = ArrayAllocatorUtils.Allocate <double>(parameters.InputLayerSize, parameters.HiddenLayerSize);
            wagesBetweenHiddenLayers             = ArrayAllocatorUtils.Allocate <double>(parameters.NumberOfHiddenLayers - 1, parameters.HiddenLayerSize, parameters.HiddenLayerSize);
            wagesBetweenLastHiddenAndOutputLayer = ArrayAllocatorUtils.Allocate <double>(parameters.HiddenLayerSize, parameters.OutputLayerSize);
            biasesInHiddenLayers = ArrayAllocatorUtils.Allocate <double>(parameters.NumberOfHiddenLayers, parameters.HiddenLayerSize);
            biasesInOutputLayer  = ArrayAllocatorUtils.Allocate <double>(parameters.OutputLayerSize);

            this.activationFunctionType = parameters.ActivationFunctionType;
            activationFunction          = ActivationFunctionFactory.Get(activationFunctionType);
        }
        public static IActivationFunction GetActivationFunction(EActivationFunctionType type)
        {
            if (type == EActivationFunctionType.Sum)
            {
                return((IActivationFunction) new CSum());
            }
            else if (type == EActivationFunctionType.Tanh)
            {
                return((IActivationFunction) new CTanh());
            }
            else if (type == EActivationFunctionType.Step)
            {
                return((IActivationFunction) new CStep());
            }

            throw new ApplicationException(type.ToString() + " is not supported.");
        }
        public static IActivationFunction Get(EActivationFunctionType type)
        {
            switch (type)
            {
            case EActivationFunctionType.Sum:
                return(new Sum());

            case EActivationFunctionType.Tanh:
                return(new Tanh());

            case EActivationFunctionType.Step:
                return(new Step());

            default:
                throw new ArgumentException(type.ToString() + " is not supported.");
            }
        }
        public MultiLayerNeuralNet(int inputLayerSize, int outputLayerSize, int hiddenLayerSize, int numberOfHiddenLayers, EActivationFunctionType activationFunctionType = EActivationFunctionType.Tanh)
        {
            this.wagesBetweenInputAndFirstHiddenLayer = new float[inputLayerSize, hiddenLayerSize];

            this.wagesBetweenHiddenLayers = new float[numberOfHiddenLayers - 1][, ];
            this.biasesInHiddenLayers     = new float[numberOfHiddenLayers][];

            for (int i = 0; i < this.wagesBetweenHiddenLayers.Length; i++)
            {
                this.wagesBetweenHiddenLayers[i] = new float[hiddenLayerSize, hiddenLayerSize];
            }

            for (int i = 0; i < this.biasesInHiddenLayers.Length; i++)
            {
                this.biasesInHiddenLayers[i] = new float[hiddenLayerSize];
            }

            this.wagesBetweenLastHiddenAndOutputLayer = new float[hiddenLayerSize, outputLayerSize];
            this.biasesInOutputLayer = new float[outputLayerSize];

            this.activationFunction = CActivationFunctionProvider.GetActivationFunction(activationFunctionType);
        }