Ignore:
Timestamp:
Nov 17, 2009, 12:10:10 PM (12 years ago)
Author:
kohnen
Message:
  • Transposition Analyser (Beta) added (+ Sample)
  • Costfunction updated

-

Location:
trunk/CrypPlugins/CostFunction
Files:
1 added
3 edited

Legend:

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

    r852 r859  
    4040        private IControlCost controlSlave;
    4141        private String bigramInput;
    42                
     42        private double[,] bigramMatrix;
     43        private IDictionary<string, double[]> corpusGrams;
    4344
    4445
     
    195196                        this.Value = calculateNGrams(bigramInput,2,1);
    196197                        break;
     198                    case 5: // alternative Bigram
     199                        this.Value = relativeBigramFrequency(bigramInput);
     200                        break;
    197201                    default:
    198202                        this.Value = -1;
     
    206210           
    207211        }//end Execute
    208 
     212       
     213       
    209214        public void PostExecution()
    210215        {
     
    375380            this.statistics = new Dictionary<int, IDictionary<string, double[]>>();
    376381            double score = 0;
    377             IDictionary<string, double[]> corpusGrams = GetStatistics(length);
     382            if (corpusGrams == null)
     383            { corpusGrams = GetStatistics(length); }
    378384            input = input.ToUpper();
    379385            // FIXME: case handling?
     
    402408            if (!statistics.ContainsKey(gramLength))
    403409            {
    404                 GuiLogMessage("Trying to load default statistics for " + gramLength + "-grams", NotificationLevel.Info);
     410                //GuiLogMessage("Trying to load default statistics for " + gramLength + "-grams", NotificationLevel.Info);
    405411                statistics[gramLength] = LoadDefaultStatistics(gramLength);               
    406412            }
     
    409415        }
    410416
     417
     418        public double relativeBigramFrequency(string input)
     419        {
     420            string text = input.ToUpper();
     421            if (bigramMatrix == null)
     422            {
     423                bigramMatrix = getBiGramMatrix();
     424            }
     425            double sum = 0.0;
     426            double count = 0.0;
     427
     428            for (int i = 0; i < input.Length - 1; i++)
     429            {
     430                char a = text[i];
     431                char b = text[i + 1];
     432
     433                if (isInAlphabet(a) && isInAlphabet(b))
     434                {
     435                    int x = (int)a - 65;
     436                    int y = (int)b - 65;
     437                    sum += bigramMatrix[x, y];
     438                    count++;
     439                }
     440            }
     441            return (sum/count);
     442        }
     443
     444        private double[,] getBiGramMatrix()
     445        {
     446            double[,] matrix = new double[26, 26];
     447            StreamReader reader = new StreamReader(Path.Combine(PluginResource.directoryPath, "CostFunctionDeutsch.txt"));
     448           
     449                   
     450            String text;
     451
     452            while ((text = reader.ReadLine()) != null)
     453            {
     454                text = text.ToUpper();
     455                for (int i = 0; i < text.Length - 1; i++)
     456                {
     457                    char a = text[i];
     458                    char b = text[i + 1];
     459
     460                    if (isInAlphabet(a) && isInAlphabet(b))
     461                    {
     462                        int x = (int)a - 65;
     463                        int y = (int)b - 65;
     464                        matrix[x, y] = matrix[x, y] + 1;
     465                    }
     466                }
     467
     468            }
     469
     470            for (int i = 0; i < 26; i++)
     471            {
     472                double count = 0;
     473                for (int j = 0; j < 26; j++)
     474                {
     475                    count = count + matrix[i, j];
     476
     477                }
     478
     479                for (int j = 0; j < 26; j++)
     480                {
     481                    matrix[i, j] = matrix[i, j] / (count / 100);
     482                }
     483            }
     484            return matrix;
     485        }
     486
     487        private bool isInAlphabet(char c)
     488        {
     489            int val = (int)(c);
     490            int test = val - 65;
     491            if (test >= 0 && test <= 25)
     492            {
     493                return true;
     494            }
     495            return false;
     496        }
    411497
    412498        private IDictionary<string, double[]> LoadDefaultStatistics(int length)
     
    431517
    432518            double sum = grams.Values.Sum(item => item[ABSOLUTE]);
    433             GuiLogMessage("Sum of all n-gram counts is: " + sum, NotificationLevel.Debug);
     519            //GuiLogMessage("Sum of all n-gram counts is: " + sum, NotificationLevel.Debug);
    434520
    435521            // calculate scaled values
     
    516602                    return RelationOperator.LessThen;
    517603                case 2: // Bigrams: log 2
     604                    return RelationOperator.LessThen;
     605                case 3: // Sinkov
     606                    return RelationOperator.LargerThen;
     607                case 4: // percentage
     608                    return RelationOperator.LargerThen;
     609                case 5: // alternative bigrams
    518610                    return RelationOperator.LargerThen;
    519611                default:
     
    556648                case 4: // Bigrams: Percentaged
    557649                    return plugin.calculateNGrams(plugin.ByteArrayToString(text), 2, 1);
     650                case 5: // alternative Bigram
     651                    return plugin.relativeBigramFrequency(plugin.ByteArrayToString(text));
     652
    558653                default:
    559654                    throw new NotImplementedException("The value " + ((CostFunctionSettings)this.plugin.Settings).FunctionType + " is not implemented.");
  • trunk/CrypPlugins/CostFunction/CostFunction.csproj

    r848 r859  
    8686    </None>
    8787  </ItemGroup>
     88  <ItemGroup>
     89    <None Include="CostFunctionDeutsch.txt">
     90      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     91    </None>
     92  </ItemGroup>
    8893  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
    8994  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
  • trunk/CrypPlugins/CostFunction/CostFunctionSettings.cs

    r848 r859  
    3333        #endregion
    3434       
    35         [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" })]
     35        [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", "Relative Bigram Frequency" })]
    3636        public int FunctionType
    3737        {
Note: See TracChangeset for help on using the changeset viewer.