//This is a version to match Ha's noise, not sure if right
        public static void GenerateReliabilityTrainingDataHaWay(XORArbiterPUF xPUF, int numberOfMeasurements, double[][] trainingData, double[][] trainingReliability, Random randomGenerator)
        {
            int trainingSize = trainingData.Length;
            int bitNum       = xPUF.BitNumber;

            //pregenerate training data inputs
            double[] noisyAPUFWeight1 = new double[bitNum + 1];
            double[] noisyAPUFWeight2 = new double[bitNum + 1];
            double[] sumOfResponses   = new double[trainingSize];
            for (int i = 0; i < trainingSize; i++)
            {
                trainingData[i] = GenerateRandomPhiVector(bitNum, randomGenerator);
            }

            for (int m = 0; m < numberOfMeasurements; m++) //Ha's way is flipped
            {
                double[] noiseAPUF1 = new double[bitNum + 1];
                double[] noiseAPUF2 = new double[bitNum + 1];
                for (int i = 0; i < noiseAPUF1.Length; i++)
                {
                    noiseAPUF1[i] = GenerateRandomNormalVariable(0, 0.1, randomGenerator);
                    noiseAPUF2[i] = GenerateRandomNormalVariable(0, 0.1, randomGenerator);
                }
                double[] originalAPUFWeight1 = xPUF.GetAllGroundTruthWeights()[0];
                double[] originalAPUFWeight2 = xPUF.GetAllGroundTruthWeights()[1];
                //Combine the noisy and original weights
                for (int i = 0; i < noisyAPUFWeight1.Length; i++)
                {
                    noisyAPUFWeight1[i] = originalAPUFWeight1[i] + noiseAPUF1[i];
                    noisyAPUFWeight2[i] = originalAPUFWeight2[i] + noiseAPUF2[i];
                }
                ArbiterPUF aNoisy1 = new ArbiterPUF(noisyAPUFWeight1);
                ArbiterPUF aNoisy2 = new ArbiterPUF(noisyAPUFWeight2);

                //Compute for each sample
                for (int i = 0; i < trainingSize; i++)
                {
                    int cc     = aNoisy1.ComputeResponse(trainingData[i]);
                    int ccc    = aNoisy2.ComputeResponse(trainingData[i]);
                    int result = aNoisy1.ComputeResponse(trainingData[i]) ^ aNoisy2.ComputeResponse(trainingData[i]);
                    sumOfResponses[i] = sumOfResponses[i] + result;
                }
            }

            //Last compute the reliability
            for (int i = 0; i < trainingSize; i++)
            {
                trainingReliability[i] = new double[1];
                //trainingReliability[i][0]= Math.Abs(numberOfMeasurements / 2.0 - (sumOfResponses[i] / (double)numberOfMeasurements));
                trainingReliability[i][0] = Math.Abs(numberOfMeasurements / 2.0 - (sumOfResponses[i]));
            }

            //for (int i = 0; i < trainingSize; i++)
            //{
            //    double sumOfResponses = 0;
            //    //trainingData[i] = GenerateRandomPhiVector(bitNum);
            //    trainingData[i] = GenerateRandomPhiVector(bitNum, randomGenerator);
            //    for (int m = 0; m < numberOfMeasurements; m++)
            //    {
            //        double randomNoise
            //        sumOfResponses = sumOfResponses + aPUF.ComputeNoisyResponse(trainingData[i]); //sum the measurements
            //    }
            //    trainingReliability[i] = new double[1];
            //    //trainingReliability[i][0] = sumOfResponses / (double)numberOfMeasurements;
            //    trainingReliability[i][0] = Math.Abs(numberOfMeasurements / 2.0 - (sumOfResponses / (double)numberOfMeasurements));

            //}
        }