// GET: Classifier

        public ActionResult ClassifyPre(string className, int classID)
        {
            var classModel = new ClassificationChoicePre {
                choiceName = className, choiceID = classID
            };

            return(View(classModel));
        }//End of ClassifyPre
        public ActionResult ResultsPre(ClassificationChoicePre model)
        {
            ML_DBEntities dbML = new ML_DBEntities();

            //Calculate Prior Probabilities

            var priorProbabilityM = Convert.ToDouble(
                (from c in dbML.pre96
                 where c.Metric == "Percent Malignant"
                 select new { c.Value }).Single().Value);

            var priorProbabilityB = Convert.ToDouble(
                (from c in dbML.pre96
                 where c.Metric == "Percent Benign"
                 select new { c.Value }).Single().Value);

            // Pull Benign Values From the Database

            string[,] allkeys = new string[, ] {
                { "Avg Clump Thickness", "stdev Clump Thickness" },
                { "Avg Uniformity Shape", "stdev Uniformity Shape" },
                { "Avg Uniformity Size", "stdev Uniformity Size" },
                { "Avg Bland Chromatin", "stdev Bland Chromatin" },
                { "Avg Marginal Adhesion", "stdev Marginal Adhesion" },
                { "Avg Normal Nucleoli", "stdev Normal Nucleoli" },
                { "Avg Single Epithelial Cell Size", "stdev Single Epithelial Cell Size" },
                { "Avg Bare Nuclei", "stdev Bare Nuclei" },
                { "Avg Mitosis", "stdev Mitosis" }
            };

            double[][] numbers = new double[allkeys.Length][];

            for (int i = 0; i < 9; i++)
            {
                double[] statsValues = new double[2];


                string key1 = allkeys[i, 0].ToString();
                string key2 = allkeys[i, 1].ToString();

                statsValues[0] = Convert.ToDouble(
                    (from c in dbML.pre96
                     where c.Metric == key1
                     select new { c.Value }).Single().Value);

                statsValues[1] = Convert.ToDouble(
                    (from c in dbML.pre96
                     where c.Metric == key2
                     select new { c.Value }).Single().Value);

                numbers[i] = statsValues;
            }

            // Pull Malignant Values From the Database

            string[,] allkeysM = new string[, ] {
                { "Avg Clump Thickness M", "stdev Clump Thickness M" },
                { "Avg Uniformity Shape M", "stdev Uniformity Shape M" },
                { "Avg Uniformity Size M", "stdev Uniformity Size M" },
                { "Avg Bland Chromatin M", "stdev Bland Chromatin M" },
                { "Avg Marginal Adhesion M", "stdev Marginal Adhesion M" },
                { "Avg Normal Nucleoli M", "stdev Normal Nucleoli M" },
                { "Avg Single Epithelial Cell Size M", "stdev Single Epithelial Cell Size M" },
                { "Avg Bare Nuclei M", "stdev Bare Nuclei M" },
                { "Avg Mitosis M", "stdev Mitosis M" }
            };

            double[][] numbersM = new double[allkeysM.Length][];
            for (int i = 0; i < 9; i++)
            {
                double[] statsValues = new double[2];

                string key1 = allkeysM[i, 0].ToString();
                string key2 = allkeysM[i, 1].ToString();

                statsValues[0] = Convert.ToDouble(
                    (from c in dbML.pre96
                     where c.Metric == key1
                     select new { c.Value }).Single().Value);

                statsValues[1] = Convert.ToDouble(
                    (from c in dbML.pre96
                     where c.Metric == key2
                     select new { c.Value }).Single().Value);

                numbersM[i] = statsValues;
            }


            //Calculate Likelihoods
            var diagnosisLikelihoodB =
                calculateProbability(model.clumpThickness, numbers[0]) *
                calculateProbability(model.uniformityShape, numbers[1]) *
                calculateProbability(model.uniformitySize, numbers[2]) *
                calculateProbability(model.blandChromatin, numbers[3]) *
                calculateProbability(model.marginalAdhesion, numbers[4]) *
                calculateProbability(model.normalNucleoli, numbers[5]) *
                calculateProbability(model.singleEpithelial, numbers[6]) *
                calculateProbability(model.bareNuclei, numbers[7]) *
                calculateProbability(model.mitosis, numbers[8]);



            var diagnosisLikelihoodM =
                calculateProbability(model.clumpThickness, numbersM[0]) *
                calculateProbability(model.uniformityShape, numbersM[1]) *
                calculateProbability(model.uniformitySize, numbersM[2]) *
                calculateProbability(model.blandChromatin, numbersM[3]) *
                calculateProbability(model.marginalAdhesion, numbersM[4]) *
                calculateProbability(model.normalNucleoli, numbersM[5]) *
                calculateProbability(model.singleEpithelial, numbersM[6]) *
                calculateProbability(model.bareNuclei, numbersM[7]) *
                calculateProbability(model.mitosis, numbersM[8]);

            //Compare p(X|B)p(B) to p(C|M)p(M)

            if ((diagnosisLikelihoodB * priorProbabilityB) >= (diagnosisLikelihoodM * priorProbabilityM))
            {
                ViewBag.diagnosis    = "Diagnosis: Benign";
                ViewBag.probabilityB = "The Likelihood Maximum of a Benign Tumor: " + (diagnosisLikelihoodB * priorProbabilityB).ToString();
                ViewBag.probabilityM = "The Likelihood Maximum of a Malignant Tumor: " + (diagnosisLikelihoodM * priorProbabilityM).ToString();


                Highcharts chart = new Highcharts("chart")
                                   .InitChart(new Chart {
                    DefaultSeriesType = ChartTypes.Bar
                })
                                   .SetTitle(new Title {
                    Text = "Patient Data Comparison"
                })
                                   .SetSubtitle(new Subtitle {
                    Text = "Data for Patient " + model.patientID
                })
                                   .SetXAxis(new XAxis
                {
                    Categories = new[] { "Clump Thickness", "Uniformity Size", "Uniformity Shape", "Marginal Adhesion", "Single Epithelial Cell Size",
                                         "Bare Nuclei",
                                         "Bland Chromatin",
                                         "Normal Nucleoli",
                                         "Mitosis" },

                    Title = new XAxisTitle {
                        Text = "Cell Attributes"
                    }
                })
                                   .SetYAxis(new YAxis
                {
                    Min   = 0,
                    Title = new YAxisTitle
                    {
                        Text  = "Value 1-10",
                        Align = AxisTitleAligns.High
                    }
                })
                                   .SetTooltip(new Tooltip {
                    Formatter = "function() { return ''+ this.series.name +': '+ this.y; }"
                })
                                   .SetPlotOptions(new PlotOptions
                {
                    Bar = new PlotOptionsBar
                    {
                        DataLabels = new PlotOptionsBarDataLabels {
                            Enabled = false
                        }
                    }
                })
                                   .SetCredits(new Credits {
                    Enabled = false
                })
                                   .SetSeries(new[]
                {
                    new Series {
                        Name = "Average Benign Patient", Data = new Data(new object[] { numbers[0][0], numbers[1][0], numbers[2][0], numbers[3][0], numbers[4][0], numbers[5][0],
                                                                                        numbers[6][0], numbers[7][0], numbers[8][0] })
                    },
                    new Series {
                        Name = "Average Malignant Patient", Data = new Data(new object[] { numbersM[0][0], numbersM[1][0], numbersM[2][0], numbersM[3][0], numbersM[4][0], numbersM[5][0],
                                                                                           numbersM[6][0], numbersM[7][0], numbersM[8][0] })
                    },
                    new Series {
                        Name = "Patient " + model.patientID.ToString(), Data = new Data(new object[] { model.clumpThickness, model.uniformitySize, model.uniformityShape, model.marginalAdhesion,
                                                                                                       model.singleEpithelial, model.bareNuclei, model.blandChromatin, model.normalNucleoli, model.mitosis })
                    }
                });
                return(View(chart));
            }
            else
            {
                ViewBag.diagnosis    = "Diagnosis: Malignant";
                ViewBag.probabilityB = "The Likelihood Maximum of a Benign Tumor: " + (diagnosisLikelihoodB * priorProbabilityB).ToString();
                ViewBag.probabilityM = "The Likelihood Maximum of a Malignant Tumor: " + (diagnosisLikelihoodM * priorProbabilityM).ToString();



                Highcharts chart = new Highcharts("chart")
                                   .InitChart(new Chart {
                    DefaultSeriesType = ChartTypes.Bar
                })
                                   .SetTitle(new Title {
                    Text = "Patient Data Comparison"
                })
                                   .SetSubtitle(new Subtitle {
                    Text = "Data for Patient " + model.patientID
                })
                                   .SetXAxis(new XAxis
                {
                    Categories = new[] { "Clump Thickness", "Uniformity Size", "Uniformity Shape", "Marginal Adhesion", "Single Epithelial Cell Size",
                                         "Bare Nuclei",
                                         "Bland Chromatin",
                                         "Normal Nucleoli",
                                         "Mitosis" },

                    Title = new XAxisTitle {
                        Text = "Cell Attributes"
                    }
                })
                                   .SetYAxis(new YAxis
                {
                    Min   = 0,
                    Title = new YAxisTitle
                    {
                        Text  = "Value 1-10",
                        Align = AxisTitleAligns.High
                    }
                })
                                   .SetTooltip(new Tooltip {
                    Formatter = "function() { return ''+ this.series.name +': '+ this.y; }"
                })
                                   .SetPlotOptions(new PlotOptions
                {
                    Bar = new PlotOptionsBar
                    {
                        DataLabels = new PlotOptionsBarDataLabels {
                            Enabled = false
                        }
                    }
                })
                                   .SetCredits(new Credits {
                    Enabled = false
                })
                                   .SetSeries(new[]
                {
                    new Series {
                        Name = "Average Benign Patient", Data = new Data(new object[] { numbers[0][0], numbers[1][0], numbers[2][0], numbers[3][0], numbers[4][0], numbers[5][0],
                                                                                        numbers[6][0], numbers[7][0], numbers[8][0] })
                    },
                    new Series {
                        Name = "Average Malignant Patient", Data = new Data(new object[] { numbersM[0][0], numbersM[1][0], numbersM[2][0], numbersM[3][0], numbersM[4][0], numbersM[5][0],
                                                                                           numbersM[6][0], numbersM[7][0], numbersM[8][0] })
                    },
                    new Series {
                        Name = "Patient " + model.patientID.ToString(), Data = new Data(new object[] { model.clumpThickness, model.uniformitySize, model.uniformityShape, model.marginalAdhesion,
                                                                                                       model.singleEpithelial, model.bareNuclei, model.blandChromatin, model.normalNucleoli, model.mitosis })
                    }
                });
                return(View(chart));
            }
        }