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

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

Playfair Analysis Plugin (basically runs, but not ready yet)

File size: 11.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           
214
215            return Stat;
216        }
217
218        // Create a Bigraph Statistic and write in both txt and xml file
219        internal static void CreateBS(string Path, int matrixSize)
220        {
221            string[] StatTextPath = { @"H:\Texte\Text1.txt", @"H:\Texte\Text2.txt", @"H:\Texte\Text3.txt", @"H:\Texte\Text4.txt",
222                                      @"H:\Texte\Text5.txt", @"H:\Texte\Text6.txt", @"H:\Texte\Text7.txt", @"H:\Texte\Text8.txt",
223                                      @"H:\Texte\Text9.txt", @"H:\Texte\Text10.txt", @"H:\Texte\Text11.txt", @"H:\Texte\Text12.txt",
224                                      @"H:\Texte\Text13.txt", @"H:\Texte\Text14.txt", @"H:\Texte\Text15.txt", @"H:\Texte\Text16.txt",
225                                      @"H:\Texte\Text17.txt", @"H:\Texte\Text18.txt", @"H:\Texte\Text19.txt", @"H:\Texte\Text20.txt"};
226           
227
228            /*
229            string[] StatTextPath = { @"H:\Texte eng\Text1.txt", @"H:\Texte eng\Text2.txt", @"H:\Texte eng\Text3.txt", @"H:\Texte eng\Text4.txt",
230                                      @"H:\Texte eng\Text5.txt", @"H:\Texte eng\Text6.txt", @"H:\Texte eng\Text7.txt", @"H:\Texte eng\Text8.txt",
231                                      @"H:\Texte eng\Text9.txt", @"H:\Texte eng\Text10.txt", @"H:\Texte eng\Text11.txt", @"H:\Texte eng\Text12.txt"};
232            */
233
234            BigraphStatistic BS = new BigraphStatistic(matrixSize);
235            int[,] BigraphStat = BS.Generate(StatTextPath);
236
237            string[] Tab = new string[(int)Math.Pow(matrixSize, 2)];
238            for (int i = 0; i < (int)Math.Pow(matrixSize, 2); i++)
239            {
240                for (int j = 0; j < (int)Math.Pow(matrixSize, 2); j++)
241                {
242                    Tab[i] += Convert.ToString(BigraphStat[i, j]) + " ";
243                    Tab[i] += "\t";
244                }
245            }
246
247            System.IO.File.WriteAllLines(Path + "BSde.txt", Tab);
248
249            int[][] BigraphStatDummy = new int[(int)Math.Pow(matrixSize, 2)][];
250
251            for (int i = 0; i < (int)Math.Pow(matrixSize, 2); i++)
252            {
253                BigraphStatDummy[i] = new int[(int)Math.Pow(matrixSize, 2)];
254                for (int j = 0; j < (int)Math.Pow(matrixSize, 2); j++)
255                {
256                    BigraphStatDummy[i][j] = BigraphStat[i, j];
257                }
258            }
259
260            System.Xml.Serialization.XmlSerializer WriteBS = new System.Xml.Serialization.XmlSerializer(typeof(Int32[][]));
261            System.Xml.XmlWriter XmlWriter = System.Xml.XmlWriter.Create(Path + "BSde.xml");
262            WriteBS.Serialize(XmlWriter, BigraphStatDummy);
263            XmlWriter.Close();
264
265            // Compute log-probabilities
266            int sum = 0;
267            foreach (int value in BigraphStat)
268                sum += value;
269
270
271            double[][] BigraphStatLog = new double[(int)Math.Pow(matrixSize, 2)][];
272
273            for (int i = 0; i < (int)Math.Pow(matrixSize, 2); i++)
274            {
275                BigraphStatLog[i] = new double[(int)Math.Pow(matrixSize, 2)];
276                for (int j = 0; j < (int)Math.Pow(matrixSize, 2); j++)
277                {
278                    if (BigraphStat[i, j] > 0)
279                    {
280                        BigraphStatLog[i][j] = Math.Log((double)BigraphStat[i, j] / sum);
281                    }
282                    else
283                        BigraphStatLog[i][j] = -10;
284                }
285            }
286
287            string[] TabLog = new string[(int)Math.Pow(matrixSize, 2)];
288            for (int i = 0; i < (int)Math.Pow(matrixSize, 2); i++)
289            {
290                for (int j = 0; j < (int)Math.Pow(matrixSize, 2); j++)
291                {
292                    TabLog[i] += Convert.ToString(BigraphStatLog[i][j]) + "\t";
293                }
294            }
295
296            System.Xml.Serialization.XmlSerializer WriteBSLog = new System.Xml.Serialization.XmlSerializer(typeof(Double[][]));
297            System.Xml.XmlWriter XmlWriterLog;
298
299            switch (matrixSize)
300            {
301                case 5:
302                    System.IO.File.WriteAllLines(Path + "BSLog10sde.txt", TabLog);
303                    XmlWriterLog = System.Xml.XmlWriter.Create(Path + "BSLog10sde.xml");
304                    break;
305                case 6:
306                    System.IO.File.WriteAllLines(Path + "BSLog10lde.txt", TabLog);
307                    XmlWriterLog = System.Xml.XmlWriter.Create(Path + "BSLog10lde.xml");
308                    break;
309                default:
310                    XmlWriterLog = System.Xml.XmlWriter.Create(Path + "BSLog10.xml");
311                    break;
312            }           
313           
314            WriteBSLog.Serialize(XmlWriterLog, BigraphStatLog);
315            XmlWriterLog.Close();
316
317        }               
318
319    }
320}
Note: See TracBrowser for help on using the repository browser.