source: trunk/CrypPlugins/PlayfairAnalysis/BigraphStatistic.cs @ 2334

Last change on this file since 2334 was 1979, checked in by Christoph Hartmann, 11 years ago

accepts a custom (user defined) bigraph statistic, wich is generated by the PlayfairAnalysisStatistic plugin

File size: 12.5 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Cryptool.Plugins.PlayfairAnalysis;
6using System.Diagnostics;
7using Cryptool.PluginBase;
8
9namespace Cryptool.Plugins.PlayfairAnalysis
10{
11    class BigraphStatistic
12    {
13        int NumberOfFiles;
14        string[] Path;
15        string[] Text;
16        int TotalLength;
17        KeySearcher keySearcher;
18        int matrixSize;
19
20        public BigraphStatistic(int matrixSize)
21        {
22            keySearcher = new KeySearcher(matrixSize);
23            this.matrixSize = matrixSize;
24        }
25
26        void LoadFiles(int matrixSize)
27        {
28            byte[] UnformattedTextByte;
29            string UnformattedText;
30            Text = new string[NumberOfFiles];
31
32            for (int i = 0; i < NumberOfFiles; i++)
33            {
34                UnformattedTextByte = System.IO.File.ReadAllBytes(Path[i]);
35                UnformattedText = Encoding.Default.GetString(UnformattedTextByte);
36                Text[i] = keySearcher.Format(UnformattedText);
37            }
38        }
39
40        public int[,] Generate(string[] Path)
41        {
42            this.Path = Path;
43            NumberOfFiles = Path.Length;
44            int[,] Stat = new int[(int)Math.Pow(matrixSize, 2), (int)Math.Pow(matrixSize, 2)];
45            int Length;
46            int Pos1, Pos2;
47
48            LoadFiles(matrixSize);
49
50            switch (matrixSize)
51            {
52                case 5:
53                    for (int i = 0; i < NumberOfFiles; i++)
54                    {
55                        Length = Text[i].Length;
56                        TotalLength += Length;
57
58                        for (int j = 0; j < Length - 1; j += 2)
59                        {
60                            if (Text[i][j] < 'J')
61                                Pos1 = Text[i][j] - 'A';
62                            else
63                                Pos1 = Text[i][j] - 'B';
64
65                            if (Text[i][j + 1] < 'J')
66                                Pos2 = Text[i][j + 1] - 'A';
67                            else
68                                Pos2 = Text[i][j + 1] - 'B';
69
70                            Stat[Pos1, Pos2] += 1;
71                        }
72                    }
73                    break;
74
75                case 6:
76                    for (int i = 0; i < NumberOfFiles; i++)
77                    {
78                        Length = Text[i].Length;
79                        TotalLength += Length;
80
81                        for (int j = 0; j < Length - 1; j += 2)
82                        {
83                            if (Text[i][j] >= 'A' && Text[i][j] <= 'Z')
84                                Pos1 = Text[i][j] - 'A';
85                            else
86                                Pos1 = Text[i][j] - '0' + 26;
87
88                            if (Text[i][j + 1] >= 'A' && Text[i][j + 1] <= 'Z')
89                                Pos2 = Text[i][j + 1] - 'A';
90                            else
91                                Pos2 = Text[i][j + 1] - '0' + 26;
92                           
93                            Stat[Pos1, Pos2] += 1;
94                        }
95                    }
96
97                    break;
98            }
99
100            return Stat;
101        }
102
103        public int[,] Calc(string Text)
104        {
105            int[,] Stat = new int[(int)Math.Pow(matrixSize, 2), (int)Math.Pow(matrixSize, 2)];
106            int Pos1, Pos2;
107
108            switch (matrixSize)
109            {
110                case 5:
111                    for (int i = 0; i < Text.Length - 1; i += 2)
112                    {
113                        if (Text[i] < 'J')
114                            Pos1 = Text[i] - 'A';
115                        else
116                            Pos1 = Text[i] - 'B';
117
118                        if (Text[i + 1] < 'J')
119                            Pos2 = Text[i + 1] - 'A';
120                        else
121                            Pos2 = Text[i + 1] - 'B';
122
123                        Stat[Pos1, Pos2] += 1;
124                    }
125                    break;
126
127                case 6:
128                    for (int i = 0; i < Text.Length - 1; i += 2)
129                    {
130                        if (Text[i] >= 'A' && Text[i] <= 'Z')
131                            Pos1 = Text[i] - 'A';
132                        else
133                            Pos1 = Text[i] - '0' + 26;
134
135                        if (Text[i + 1] >= 'A' && Text[i + 1] <= 'Z')
136                            Pos2 = Text[i + 1] - 'A';
137                        else
138                            Pos2 = Text[i + 1] - '0' + 26;
139
140                        Stat[Pos1, Pos2] += 1;
141                    }
142                    break;
143
144                default:
145                    break;
146            }
147
148            return Stat;
149        }
150
151
152        public double[,] CalcLog(string Text)
153        {
154            double[,] Stat = new double[(int)Math.Pow(matrixSize, 2), (int)Math.Pow(matrixSize, 2)];
155            int Pos1, Pos2;
156            int sum = 0;
157
158            switch (matrixSize)
159            {
160                case 5:
161                    for (int i = 0; i < Text.Length - 1; i += 2)
162                    {
163                        if (Text[i] < 'J')
164                            Pos1 = Text[i] - 'A';
165                        else
166                            Pos1 = Text[i] - 'B';
167
168                        if (Text[i + 1] < 'J')
169                            Pos2 = Text[i + 1] - 'A';
170                        else
171                            Pos2 = Text[i + 1] - 'B';
172
173                        Stat[Pos1, Pos2]++;
174                        sum++;
175                    }
176                    break;
177
178                case 6:
179                    for (int i = 0; i < Text.Length - 1; i += 2)
180                    {
181                        if (Text[i] >= 'A' && Text[i] <= 'Z')
182                            Pos1 = Text[i] - 'A';
183                        else
184                            Pos1 = Text[i] - '0' + 26;
185
186                        if (Text[i + 1] >= 'A' && Text[i + 1] <= 'Z')
187                            Pos2 = Text[i + 1] - 'A';
188                        else
189                            Pos2 = Text[i + 1] - '0' + 26;
190
191                        Stat[Pos1, Pos2]++;
192                        sum++;
193                    }
194                    break;
195
196                default:
197                    break;
198            }
199
200            for (int i = 0; i < (int)Math.Pow(matrixSize, 2); i++)
201            {
202                for (int j = 0; j < (int)Math.Pow(matrixSize, 2); j++)
203                {
204                    if (Stat[i, j] > 0)
205                    {
206                        Stat[i, j] = Math.Log(Stat[i, j] / sum);
207                    }
208                    else
209                        Stat[i, j] = -10;
210                }
211            }
212
213            return Stat;
214        }
215
216
217        public double[,] CalcLogStat(string text, string alphabet)
218        {
219            double[,] Stat = new double[(int)Math.Pow(matrixSize, 2), (int)Math.Pow(matrixSize, 2)];
220            int Pos1, Pos2;
221            int sum = 0;
222                       
223            for (int i = 0; i < text.Length - 1; i += 2)
224            {
225                Pos1 = alphabet.IndexOf(text[i]);
226                Pos2 = alphabet.IndexOf(text[i + 1]);
227
228                Stat[Pos1, Pos2]++;
229                sum++;
230            }
231                       
232            for (int i = 0; i < (int)Math.Pow(matrixSize, 2); i++)
233            {
234                for (int j = 0; j < (int)Math.Pow(matrixSize, 2); j++)
235                {
236                    if (Stat[i, j] > 0)
237                    {
238                        Stat[i, j] = Math.Log(Stat[i, j] / sum);
239                    }
240                    else
241                        Stat[i, j] = -10;
242                }
243            }
244            return Stat;
245        }
246
247        // Create a Bigraph Statistic and write in both txt and xml file
248        internal static void CreateBS(string Path, int matrixSize)
249        {
250            string[] StatTextPath = { @"H:\Texte\Text1.txt", @"H:\Texte\Text2.txt", @"H:\Texte\Text3.txt", @"H:\Texte\Text4.txt",
251                                      @"H:\Texte\Text5.txt", @"H:\Texte\Text6.txt", @"H:\Texte\Text7.txt", @"H:\Texte\Text8.txt",
252                                      @"H:\Texte\Text9.txt", @"H:\Texte\Text10.txt", @"H:\Texte\Text11.txt", @"H:\Texte\Text12.txt",
253                                      @"H:\Texte\Text13.txt", @"H:\Texte\Text14.txt", @"H:\Texte\Text15.txt", @"H:\Texte\Text16.txt",
254                                      @"H:\Texte\Text17.txt", @"H:\Texte\Text18.txt", @"H:\Texte\Text19.txt", @"H:\Texte\Text20.txt"};
255           
256
257            /*
258            string[] StatTextPath = { @"H:\Texte eng\Text1.txt", @"H:\Texte eng\Text2.txt", @"H:\Texte eng\Text3.txt", @"H:\Texte eng\Text4.txt",
259                                      @"H:\Texte eng\Text5.txt", @"H:\Texte eng\Text6.txt", @"H:\Texte eng\Text7.txt", @"H:\Texte eng\Text8.txt",
260                                      @"H:\Texte eng\Text9.txt", @"H:\Texte eng\Text10.txt", @"H:\Texte eng\Text11.txt", @"H:\Texte eng\Text12.txt"};
261            */
262
263            BigraphStatistic BS = new BigraphStatistic(matrixSize);
264            int[,] BigraphStat = BS.Generate(StatTextPath);
265
266            string[] Tab = new string[(int)Math.Pow(matrixSize, 2)];
267            for (int i = 0; i < (int)Math.Pow(matrixSize, 2); i++)
268            {
269                for (int j = 0; j < (int)Math.Pow(matrixSize, 2); j++)
270                {
271                    Tab[i] += Convert.ToString(BigraphStat[i, j]) + " ";
272                    Tab[i] += "\t";
273                }
274            }
275
276            System.IO.File.WriteAllLines(Path + "BSde.txt", Tab);
277
278            int[][] BigraphStatDummy = new int[(int)Math.Pow(matrixSize, 2)][];
279
280            for (int i = 0; i < (int)Math.Pow(matrixSize, 2); i++)
281            {
282                BigraphStatDummy[i] = new int[(int)Math.Pow(matrixSize, 2)];
283                for (int j = 0; j < (int)Math.Pow(matrixSize, 2); j++)
284                {
285                    BigraphStatDummy[i][j] = BigraphStat[i, j];
286                }
287            }
288
289            System.Xml.Serialization.XmlSerializer WriteBS = new System.Xml.Serialization.XmlSerializer(typeof(Int32[][]));
290            System.Xml.XmlWriter XmlWriter = System.Xml.XmlWriter.Create(Path + "BSde.xml");
291            WriteBS.Serialize(XmlWriter, BigraphStatDummy);
292            XmlWriter.Close();
293
294            // Compute log-probabilities
295            int sum = 0;
296            foreach (int value in BigraphStat)
297                sum += value;
298
299
300            double[][] BigraphStatLog = new double[(int)Math.Pow(matrixSize, 2)][];
301
302            for (int i = 0; i < (int)Math.Pow(matrixSize, 2); i++)
303            {
304                BigraphStatLog[i] = new double[(int)Math.Pow(matrixSize, 2)];
305                for (int j = 0; j < (int)Math.Pow(matrixSize, 2); j++)
306                {
307                    if (BigraphStat[i, j] > 0)
308                    {
309                        BigraphStatLog[i][j] = Math.Log((double)BigraphStat[i, j] / sum);
310                    }
311                    else
312                        BigraphStatLog[i][j] = -10;
313                }
314            }
315
316            string[] TabLog = new string[(int)Math.Pow(matrixSize, 2)];
317            for (int i = 0; i < (int)Math.Pow(matrixSize, 2); i++)
318            {
319                for (int j = 0; j < (int)Math.Pow(matrixSize, 2); j++)
320                {
321                    TabLog[i] += Convert.ToString(BigraphStatLog[i][j]) + "\t";
322                }
323            }
324
325            System.Xml.Serialization.XmlSerializer WriteBSLog = new System.Xml.Serialization.XmlSerializer(typeof(Double[][]));
326            System.Xml.XmlWriter XmlWriterLog;
327
328            switch (matrixSize)
329            {
330                case 5:
331                    System.IO.File.WriteAllLines(Path + "BSLog10sde.txt", TabLog);
332                    XmlWriterLog = System.Xml.XmlWriter.Create(Path + "BSLog10sde.xml");
333                    break;
334                case 6:
335                    System.IO.File.WriteAllLines(Path + "BSLog10lde.txt", TabLog);
336                    XmlWriterLog = System.Xml.XmlWriter.Create(Path + "BSLog10lde.xml");
337                    break;
338                default:
339                    XmlWriterLog = System.Xml.XmlWriter.Create(Path + "BSLog10.xml");
340                    break;
341            }           
342           
343            WriteBSLog.Serialize(XmlWriterLog, BigraphStatLog);
344            XmlWriterLog.Close();
345
346        }               
347
348    }
349}
Note: See TracBrowser for help on using the repository browser.