private string[] writeStatics(staticSet newResults)
        {
            // create an array of strings out of static data


            string [] output = new string[16];

            output[0]  = "0";                                     // ID
            output[1]  = DateTime.Now.Date.ToString();            // Today's Date
            output[2]  = DateTime.Now.TimeOfDay.ToString();       // now s time
            output[3]  = datasetFolder.Text;                      // address of dataset
            output[4]  = phraseFile.Text;                         // address of phrase files
            output[5]  = newResults.totalspam.ToString();         // total spams used
            output[6]  = newResults.totalham.ToString();          // total hams used
            output[7]  = phraseNumber.Value.ToString();           // total phrases used
            output[8]  = selectedAlgorithm.ToString();            // algorithm used
            output[9]  = (thresholdValue.Value / 100).ToString(); // value of thrshold
            output[10] = newResults.time.ToString();              // time spent
            output[11] = newResults.accuracy.ToString();          // accuracy
            output[12] = newResults.fpositives.ToString();        // false positives
            output[13] = newResults.fnegatives.ToString();        // false negatives
            output[14] = newResults.spamrecall.ToString();        // spam recall
            output[15] = newResults.spamper.ToString();           // spam precision



            return(output);
        }
        private void saveLogFile(staticSet newResults)
        {
            // this function writes the new static results to a file

            if (saveAddress == "")
            {
                saveAddress = browseFile();
            }

            loadText.Text = saveAddress;


            bool append = false;

            // headers
            string[] newLine = { "ID",          "Date",            "Time",                  "Data Set", "Phrase File",
                                 "Total Spams", "Total Hams",      "Total Used Phrases",
                                 "Algorithm",   "Threshold",       "Time Spend (seconds) ",
                                 "Accuracy",    "False Positives", "False Negatives",
                                 "Spam Recall", "Spam Precision" };


            append = File.Exists(saveAddress);



            // write the statics into a line in the list


            // write all lines
            try
            {
                StreamWriter writer = new StreamWriter(saveAddress, append);
                if (!append)
                {
                    WriteFile(ref writer, newLine);
                }

                newLine = writeStatics(newResults);
                WriteFile(ref writer, newLine);
                writer.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void runBtm_Click(object sender, EventArgs e)
        {
            // this creates a static structure
            staticSet resultStatic = new staticSet();

            resultStatic = calculateStatics(hamFiles, spamFiles, selectedAlgorithm);

            // write down the result box
            timeBox.Text       = string.Format("Time: {0}", resultStatic.time);
            accurecyBox.Text   = string.Format("Accuracy: {0}", resultStatic.accuracy);
            falseNbox.Text     = string.Format("False Negatives: {0}", resultStatic.fnegatives);
            falsePBox.Text     = string.Format("False Positives: {0}", resultStatic.fpositives);
            spamPrecision.Text = string.Format("Spam Percesion: {0}", resultStatic.spamper);
            spamRecallBox.Text = string.Format("Spam Recall: {0}", resultStatic.spamrecall);

            if (saveFile.Checked)
            {
                saveLogFile(resultStatic);
            }


            fillBox();
        }
        /// <summary>
        /// this calcuate the shown statics for each algorithm
        /// </summary>
        /// <param name="hams">list of ham files </param>
        /// <param name="spams">list of spam files </param>
        /// <param name="algorithm"></param>
        /// <returns></returns>
        staticSet calculateStatics(string[] hams, string[] spams, AlgorithmBox algorithm)
        {
            staticSet myStatics = new staticSet(0);

            int hamScores  = 0;
            int spamScores = 0;

            myStatics.totalham  = (float)hamNumber.Value;
            myStatics.totalspam = (float)spamNumber.Value;
            progressBar.Value   = 0;
            progressBar.Maximum = (int)(myStatics.totalham + myStatics.totalspam);

            DateTime  tic    = DateTime.Now;
            Algorithm myAlgo = null;

            switch (algorithm)
            {
            case AlgorithmBox.LCS:
                myAlgo = new LCSWord();
                break;


            case AlgorithmBox.Levenshtein:
                myAlgo = new Levenshtien();
                break;

            case AlgorithmBox.Jaro:
                myAlgo = new Jaro();
                break;

            case AlgorithmBox.JaroWinker:
                myAlgo = new JaroWinker();
                break;

            case AlgorithmBox.BiGram:
                myAlgo = new BGram();
                break;

            default:
                break;
            }
            // we need a conditon here
            if (selectedAlgorithm == AlgorithmBox.TFIDF)
            {
                TFIDF myTFI = new TFIDF();
                myTFI.Terms = phrasePower;
                Loop(hams, hamNumber.Value, false, myTFI);
                Loop(spams, spamNumber.Value, true, myTFI);

                // the TFIDF runner
                myTFI.run();
                float threshold = ((float)thresholdValue.Value) / 100F;
                myTFI.claculate(ref hamScores, ref spamScores, threshold);
            }
            else
            {
                // other runners
                hamScores  = Loop(hams, hamNumber.Value, myAlgo);
                spamScores = Loop(spams, spamNumber.Value, myAlgo);
            }



            DateTime toc       = DateTime.Now;
            TimeSpan timeSpent = toc - tic;

            // calculate the spent time , a simple timing mechanism
            myStatics.time = (float)timeSpent.TotalSeconds;

            if (myStatics.totalspam > 0)
            {
                // false negatives
                myStatics.fnegatives = (myStatics.totalspam - spamScores) / myStatics.totalspam;

                // spam recall
                myStatics.spamrecall = spamScores / myStatics.totalspam;

                // spam precision
                myStatics.spamper = spamScores / (spamScores + (myStatics.totalham - hamScores));
            }

            if (myStatics.totalham > 0)
            {
                // false positives
                myStatics.fpositives = (myStatics.totalham - hamScores) / myStatics.totalham;
            }

            if (myStatics.totalham > 0 || myStatics.totalspam > 0)
            {
                // accuracy
                myStatics.accuracy = 1 - (((myStatics.totalspam - spamScores) + (myStatics.totalham - hamScores)) / (myStatics.totalham + myStatics.totalspam));
            }

            // Spam recall



            return(myStatics);
        }