public Example[] parseDatasetFile(string filename)
        {
            string[] lines = System.IO.File.ReadAllLines(filename);

            string[] dimensions = lines[0].Split(' ');
            Example.IMG_HEIGHT = Int32.Parse(dimensions[0]);
            Example.IMG_WIDTH = Int32.Parse(dimensions[1]);

            int datasetSize = Int32.Parse(lines[1]);
            Example[] dataset = new Example[datasetSize];

            for (int lineIndex = 2, exampleIndex = 0; exampleIndex < datasetSize;
                lineIndex += Example.IMG_HEIGHT + 1, exampleIndex++)
            {
                char letter = Char.Parse(lines[lineIndex]);
                int[,] imageBits = new int[Example.IMG_HEIGHT,Example.IMG_WIDTH];

                for (int i = 0; i < Example.IMG_HEIGHT; i++)
                {
                    string[] matrixRow = lines[lineIndex + 1 + i].Split(' ');
                    for (int j = 0; j < Example.IMG_WIDTH; j++)
                    {
                        imageBits[i,j] = Int32.Parse(matrixRow[j]);
                    }

                }
                //Console.WriteLine("Loading Examples");
                //Console.WriteLine(exampleIndex + "/" + datasetSize);
                dataset[exampleIndex] = new Example(imageBits, letter);
            }

            return dataset;
        }
 public IFitness CreateFitness(Example[] dataset, int numInputs, int numOutputs,
     int numHiddenLayers, int[] numNeuronsPerHiddenLayer,
     double LEARNING_RATE = 0.01, double MOMENTUM = 0.0)
 {
     fitness = new NetworkFitness(ref dataset,
         numInputs, numOutputs,
         numHiddenLayers, numNeuronsPerHiddenLayer,
         LEARNING_RATE, MOMENTUM);
     return fitness;
 }
 public static double CalculateError(ref Example[] dataset, ref NeuralNetwork network)
 {
     double error = 0.0;
     foreach (Example example in dataset)
     {
         network.classify(example.ToNetworkInput());
         error += network.squaredError(example.ToNetworkOutput());
     }
     return error * 0.5;
 }
 // return average error of all partition errors
 public double CalculatePrecision(ref Example[] set)
 {
     double sum = 0.0;
     for (int i = 0; i < this.numTests; i++)
     {
         Console.WriteLine("Partition No. " + i);
         sum += this.CalculatePrecisionPartition(ref set, i);
     }
     Console.WriteLine("Avg total error = " + (sum / this.numTests));
     return sum / this.numTests;
 }
 public NetworkFitness(ref Example[] _dataset, int _numInputs, int _numOutputs,
     int _numHiddenLayers, int[] _numNeuronsPerHiddenLayer,
     double _LEARNING_RATE = 0.01, double _MOMENTUM = 0.0)
     : base()
 {
     this.dataset = _dataset;
     this.numInputs = _numInputs;
     this.numOutputs = _numOutputs;
     this.numHiddenLayers = _numHiddenLayers;
     this.numNeuronsPerHiddenLayer = _numNeuronsPerHiddenLayer;
     this.LEARNING_RATE = _LEARNING_RATE;
     this.MOMENTUM = _MOMENTUM;
 }
        public CrossValidation(Example[] _dataset, int _numTests, ref CharacterRecognition _cr, Random seed)
        {
            this.seed = seed;
            this.numTests = _numTests;
            this.datasetPartitions = new List<Example>[this.numTests];
            for (int n = 0; n < this.numTests; n++)
            {
                this.datasetPartitions[n] = new List<Example>();
            }
            for (int i = 0; i < _dataset.Length; i++)
            {
                this.datasetPartitions[i % this.numTests].Add(_dataset[i]);
            }

            this.cr = _cr;
        }
        public void Initialize(Example[] examples)
        {
            this.networks = new NeuralNetwork[this.numNetworks];
            for (int i = 0; i < this.numNetworks; i++)
            {
                NetworkEvolution evolution = new NetworkEvolution(ref examples,
                    this.networkNumInputs, this.networkNumOutputs,
                    this.networkNumHiddenLayers, this.networkNumNeuronsPerHiddenLayer, seed);
                networks[i] = evolution.EvolveNetwork();

                /*foreach (Example example in examples)
                {
                    networks[i].learn(example.ToNetworkInput(), example.ToNetworkOutput());
                }*/
            Console.WriteLine("Network No. " + i);
            Console.WriteLine(DateTime.Now.ToString());
            }
        }
        // return average error per partition
        private double CalculatePrecisionPartition(ref Example[] examples, int i)
        {
            Example[] testSet = this.datasetPartitions[i].ToArray();
            List<Example> trainSet = new List<Example>();
            for (int j = 0; j < this.datasetPartitions.Length; j++)
            {
                if (i == j % this.numTests)
                    continue;

                trainSet.AddRange(this.datasetPartitions[j]);
            }

            Example[] trainSetArray = trainSet.ToArray();
            OCR.Shuffle(trainSetArray,seed);
            this.cr.Initialize(trainSetArray);

            double sumErrors = 0.0;
            int sumErrorsLetters = 0;
            int sumBigger = 0;
            foreach (Example example in testSet)
            {
                double[] output = this.cr.RecognizeCharacter(example.ToNetworkInput());
                //Console.WriteLine("Output is " + Array.IndexOf(output, output.Max()));
                //Console.WriteLine("Correct is " + example.letterToInt() + "\n");
                //Console.WriteLine("Correct is '" + example.letter +"' - int(" + example.letterToInt() + ")\n");
                for (int x = 0; x < output.Length; x++)
                {
                    sumBigger += (output[x] > output[example.letterToInt()] ? 1 : 0);
                    //Console.Write("" + x + ": \t" + output[x] + "\n");
                }
                //Console.Write("" + example.letterToInt() + "-" + Array.IndexOf(output, output.Max()) + "; ");
                sumErrorsLetters += (example.letterToInt() == Array.IndexOf(output, output.Max()) ? 0 : 1);
                sumErrors += example.SquaredError(output);
            }
            Console.WriteLine("Avg error = " + (sumErrors * 0.5 / (double)testSet.Length));
            Console.WriteLine("Avg error (letter index) = " + ((double)sumErrorsLetters / (double)testSet.Length));
            Console.WriteLine("Avg error (bigger index) = " + ((double)sumBigger / (double)testSet.Length));
            Console.WriteLine();
            this.cr.SaveToDirectory(@"C:\Users\Dimiter\Desktop\", "nn" + i + "_");
            return sumErrors * 0.5 / testSet.Length;
        }