Changeset 1375


Ignore:
Timestamp:
May 2, 2010, 9:43:36 PM (12 years ago)
Author:
malischewski
Message:

Started implementation of new costfunction for genetic algorithm analysis of transposition cipher.
note: is listed as "weighted bigrams/trigrams" in the plugin, but not functional yet (will be tomorrow, probably)

Location:
trunk/CrypPlugins/CostFunction
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/CostFunction/CostFunction.cs

    r1208 r1375  
    1717using System;
    1818using System.Collections.Generic;
     19using System.Collections;
    1920using System.Linq;
    2021using System.Text;
     
    4546        private IDictionary<string, double[]> corpusGrams;
    4647
     48        private IDictionary<string, double[]> corpusBigrams; // Used for Weighted Bigrams/Trigrams Cost function
     49        private IDictionary<string, double[]> corpusTrigrams;
     50
    4751        private DataManager dataMgr = new DataManager();
    4852        private const string DATATYPE = "transposition";
     
    204208                        this.Value = regex(bigramInput);
    205209                        break;
     210                    case 6: // Weighted Bigrams/Trigrams (used by genetic algorithm in transposition analyser
     211                        this.Value = calculateWeighted(bigramInput);
     212                        break;
     213
    206214                    default:
    207215                        this.Value = -1;
     
    214222            }//end if
    215223
    216         }//end Execute
     224        }
     225
    217226
    218227
     
    288297        //    return -1.0;
    289298        //}
     299        public double calculateWeighted(string input)
     300        {
     301
     302
     303            this.statistics = new Dictionary<int, IDictionary<string, double[]>>();
     304           
     305            if (corpusBigrams == null)
     306            {
     307                if (corpusTrigrams == null)
     308                {
     309
     310                    corpusBigrams = GetStatistics(2); // Get Known Language statistics for Bigrams
     311                    corpusTrigrams = GetStatistics(3); // and Trigrams
     312                }
     313
     314            }
     315            input = input.ToUpper();
     316
     317            /* debug foreach (KeyValuePair<string,double[]> g in corpusTrigrams)
     318             {
     319                 GuiLogMessage(corpusTrigrams[g.Key][0].ToString()+ " "+g.Key, NotificationLevel.Debug);
     320             } */
     321
     322
     323            Dictionary<string, double> inputBiGrams = new Dictionary<string,double>();
     324            Dictionary<string, double> inputTriGrams = new Dictionary<string,double>();
     325
     326            // Count input Bigrams
     327            foreach (string g in GramTokenizer.tokenize(input, 2, false))
     328            {
     329                if (inputBiGrams.ContainsKey(g))
     330                {
     331                    inputBiGrams[g] = inputBiGrams[g] + 1;
     332                }
     333                else
     334                {
     335                    inputBiGrams.Add(g, 0);
     336                }
     337            }
     338            //debug
     339            foreach (KeyValuePair<string, double[]> g in corpusBigrams)
     340            {
     341                GuiLogMessage(corpusBigrams[g.Key][0].ToString() + " " + g.Key + " " + corpusBigrams[g.Key][1].ToString(), NotificationLevel.Debug);
     342            }
     343           
     344            // Count input TriGrams
     345            foreach (string g in GramTokenizer.tokenize(input, 3, false))
     346            {
     347                if (inputTriGrams.ContainsKey(g))
     348                {
     349                    inputTriGrams[g] = inputTriGrams[g] + 1;
     350                }
     351                else
     352                {
     353                    inputTriGrams.Add(g, 0);
     354                }
     355            }
     356
     357            // First part of the equation: Sum up all [K_b (i,j) - D_b (i,j)]
     358            double bigramscore = 0.0;
     359            foreach (KeyValuePair<string, double[]> g in corpusBigrams)
     360            {
     361                // bigramscore += g.Value[1] - inputBiGrams[g]/inputBiGrams.Sum<value;
     362            }
     363
     364            // Second part of the equation: Sum up all [K_t (i,j) - D_t (i,j)]
     365           
     366
     367            return bigramscore;
     368        }//end Execute
    290369
    291370        public double regex(string input)
     
    342421        /// <returns>Index of Coincidence</returns>
    343422        public double calculateIndexOfCoincidence(byte[] text, int bytesToUse)
    344         {           
     423        {
    345424            if (bytesToUse > text.Length)
    346425                bytesToUse = text.Length;
     
    492571            txtList = dataMgr.LoadDirectory(DATATYPE);
    493572
    494             return calculateAbsolutes(txtList["2gram.txt"].DataFile.FullName);
    495         }
    496 
    497         private IDictionary<string, double[]> calculateAbsolutes(String path)
     573            return calculateAbsolutes(txtList["2gram.txt"].DataFile.FullName, length);
     574        }
     575
     576        private IDictionary<string, double[]> calculateAbsolutes(String path, int length)
    498577        {
    499578
    500579
    501580            Dictionary<string, double[]> grams = new Dictionary<string, double[]>();
    502 
     581            int checkLength;
    503582            StreamReader reader = new StreamReader(path);
    504583            String text = reader.ReadToEnd();
     
    507586            text = Regex.Replace(text, "[^A-Z]*", "");
    508587
    509 
    510             for (int i = 0; i < text.Length - 1; i++)
     588            if (length == 2)
     589            {
     590                checkLength = text.Length - 1;
     591            }
     592            else
     593            {
     594                checkLength = text.Length - 2;
     595            }
     596            for (int i = 0; i < checkLength; i++)
    511597            {
    512598                char a = text[i];
    513599                char b = text[i + 1];
    514                 String key = a.ToString();
    515                 key = key + b.ToString();
     600                String key;
     601                if (length == 3) // Trigrams
     602                {
     603                    char c = text[i + 2];
     604                    key = a.ToString();
     605                    key = key + b.ToString();
     606                    key = key + c.ToString();
     607                }
     608                else // Bigrams
     609                {
     610                    key = a.ToString();
     611                    key = key + b.ToString();
     612                }
    516613
    517614                if (!grams.ContainsKey(key))
    518615                {
    519                     grams.Add(key, new double[] { 1, 0, 0, 0 });
     616                    grams.Add(key, new double[] { 1, 0, 0, 0});
    520617                }
    521618                else
     
    605702                case 5: // Regular Expression
    606703                    return RelationOperator.LargerThen;
     704                case 6: // Weighted Bigrams/Trigrams
     705                    return RelationOperator.LargerThen;
     706
    607707                default:
    608708                    throw new NotImplementedException("The value " + ((CostFunctionSettings)this.plugin.Settings).FunctionType + " is not implemented.");
     
    646746                case 5: // regular expression
    647747                    return plugin.regex(plugin.ByteArrayToString(text));
     748                case 6:
     749                    return plugin.calculateWeighted(plugin.ByteArrayToString(text));
    648750                default:
    649751                    throw new NotImplementedException("The value " + ((CostFunctionSettings)this.plugin.Settings).FunctionType + " is not implemented.");
  • trunk/CrypPlugins/CostFunction/CostFunctionSettings.cs

    r1176 r1375  
    3535        #endregion
    3636       
    37         [TaskPane("FunctionType", "Select the type of function", null, 1, false, DisplayLevel.Beginner, ControlType.ComboBox, new string[] { "Index of coincidence", "Entropy", "Bigrams: log 2", "Bigrams: Sinkov", "Bigrams: Percentaged", "Regular Expression"})]
     37        [TaskPane("FunctionType", "Select the type of function", null, 1, false, DisplayLevel.Beginner, ControlType.ComboBox, new string[] { "Index of coincidence", "Entropy", "Bigrams: log 2", "Bigrams: Sinkov", "Bigrams: Percentaged", "Regular Expression", "Weighted Bigrams/Trigrams"})]
    3838        public int FunctionType
    3939        {
Note: See TracChangeset for help on using the changeset viewer.