public static void Run()
        {
            Random  rng  = new Random();
            DataSet data = new XorDataSetGenerator();

            int    inputDimension   = 2;
            int    hiddenDimension  = 3;
            int    outputDimension  = 1;
            int    hiddenLayers     = 1;
            double learningRate     = 0.001;
            double initParamsStdDev = 0.08;

            INetwork nn = NetworkBuilder.MakeFeedForward(inputDimension,
                                                         hiddenDimension,
                                                         hiddenLayers,
                                                         outputDimension,
                                                         data.GetModelOutputUnitToUse(),
                                                         data.GetModelOutputUnitToUse(),
                                                         initParamsStdDev, rng);


            int reportEveryNthEpoch = 10;
            int trainingEpochs      = 100000;

            Trainer.train <NeuralNetwork>(trainingEpochs, learningRate, nn, data, reportEveryNthEpoch, rng);

            Console.WriteLine("Training Completed.");
            Console.WriteLine("Test: 1,1");

            Matrix input  = new Matrix(new double[] { 1, 1 });
            Graph  g      = new Graph(false);
            Matrix output = nn.Activate(input, g);

            Console.WriteLine("Test: 1,1. Output:" + output.W[0]);

            Matrix input1  = new Matrix(new double[] { 0, 1 });
            Graph  g1      = new Graph(false);
            Matrix output1 = nn.Activate(input1, g1);

            Console.WriteLine("Test: 0,1. Output:" + output1.W[0]);

            Console.WriteLine("done.");
        }