source: trunk/CrypPlugins/KeySearcher/Presentation/Controls/StatisticsPresentation.xaml.cs @ 2506

Last change on this file since 2506 was 2506, checked in by nolte, 11 years ago

Statistic Information Tab -> first stats added.

File size: 12.8 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.ComponentModel;
4using System.Globalization;
5using System.Linq;
6using System.Numerics;
7using System.Text;
8using System.Threading;
9using System.Windows;
10using System.Windows.Controls;
11using System.Windows.Data;
12using System.Windows.Documents;
13using System.Windows.Input;
14using System.Windows.Media;
15using System.Windows.Media.Imaging;
16using System.Windows.Navigation;
17using System.Windows.Shapes;
18using System.Windows.Threading;
19using KeySearcher;
20using KeySearcher.KeyPattern;
21
22namespace KeySearcherPresentation.Controls
23{
24    /// <summary>
25    /// Interaction logic for StatisticsPresentation.xaml
26    /// </summary>
27    [Cryptool.PluginBase.Attributes.Localization("KeySearcher.Properties.Resources")]
28    public partial class StatisticsPresentation : UserControl
29    {
30        public StatisticsPresentation()
31        {
32            InitializeComponent();
33            ((InformationToProgressConverter)Resources["InformationToProgressConverter"]).StatisticsPresentation = this;
34            ((InformationToProgressConverter2)Resources["InformationToProgressConverter2"]).StatisticsPresentation = this;
35            ((ChunkSumConverter)Resources["ChunkSumConverter"]).StatisticsPresentation = this;
36            ((StringLengthConverter)Resources["StringLengthConverter"]).StatisticsPresentation = this;
37            ((MachineSumToProgressConverter)Resources["MachineSumToProgressConverter"]).StatisticsPresentation = this;
38        }
39
40        private Dictionary<string, Dictionary<long, Information>> statistics = null;
41        public Dictionary<string, Dictionary<long, Information>> Statistics
42        {
43            get { return statistics; }
44            set
45            {
46                lock (this)
47                {
48                    statistics = value;
49                }
50                if (statistics != null)
51                    Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
52                                               {
53                                                   if (statistics != null)
54                                                   {
55                                                       var orderedstats = statistics.OrderByDescending((x) => x.Value.Sum((z) => z.Value.Count));
56                                                       statisticsTree.DataContext = orderedstats;
57                                                       statisticsTree.Items.Refresh();
58                                                   }
59                                               }, null);
60
61            }
62        }
63
64        private Dictionary<long, Maschinfo> machineHierarchy = null;
65        public Dictionary<long, Maschinfo> MachineHierarchy
66        {
67            get { return machineHierarchy; }
68            set
69            {
70                lock (this)
71                {
72                    machineHierarchy = value;
73                }
74                Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
75                                                {
76                                                    machineTree.DataContext = machineHierarchy;
77                                                    machineTree.Items.Refresh();
78                                                }, null);
79            }
80        }
81
82        private void Button_Click(object sender, RoutedEventArgs e)
83        {
84            Button b = sender as Button;
85
86            if(statisticsTree.ItemContainerStyle == null)
87            {
88                b.Content = "Expand";
89                statisticsTree.ItemContainerStyle = this.Resources["ItemStyle2"] as Style;
90            }
91
92            if (statisticsTree.ItemContainerStyle.Equals(this.Resources["ItemStyle"] as Style))
93            {
94                b.Content = "Expand";
95                statisticsTree.ItemContainerStyle = this.Resources["ItemStyle2"] as Style;
96                return;
97            }
98
99            if (statisticsTree.ItemContainerStyle.Equals(this.Resources["ItemStyle2"] as Style))
100            {
101                b.Content = "Collapse";
102                statisticsTree.ItemContainerStyle = this.Resources["ItemStyle"] as Style;
103                return;
104            }
105        }
106
107        #region Informations
108
109        public void UpdateInformation(KeySearcher.KeySearcher keySearcher, KeySearcherSettings keySearcherSettings)
110        {
111            if (keySearcher.Pattern == null || !keySearcher.Pattern.testWildcardKey(keySearcherSettings.Key) || keySearcherSettings.ChunkSize == 0)
112            {
113                return;
114            }
115
116            var keyPattern = new KeyPattern(keySearcher.ControlMaster.getKeyPattern()) { WildcardKey = keySearcherSettings.Key };
117            var keysPerChunk = Math.Pow(2, keySearcherSettings.ChunkSize);
118            var keyPatternPool = new KeyPatternPool(keyPattern, new BigInteger(keysPerChunk));
119
120            if (keyPatternPool.Length > 9999999999)
121            {
122                TotalAmountOfBlocks.Content = keyPatternPool.Length.ToString().Substring(0, 10) + "...";
123            }
124            else
125            {
126                TotalAmountOfBlocks.Content = keyPatternPool.Length;
127            }
128
129            TotalAmountOfKeys.Content = new BigInteger(keysPerChunk) * keyPatternPool.Length;
130
131
132            //Under Construction
133            //--------
134            TotalBlocksTested.Content = "???";
135            TotalKeysTested.Content = "???";
136            //--------
137        }
138        #endregion
139    }
140
141    #region Converters
142    [ValueConversion(typeof(Dictionary<long, Information>), typeof(Double))]
143    class InformationToProgressConverter : IValueConverter
144    {
145        public StatisticsPresentation StatisticsPresentation { get; set; }
146
147        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
148        {
149            if (StatisticsPresentation != null && StatisticsPresentation.Statistics != null)
150            {
151                lock (StatisticsPresentation)
152                {
153                    double allCount = (StatisticsPresentation.Statistics).Sum(i => i.Value.Sum(j => j.Value.Count));
154                    double vCount = ((Dictionary<long, Information>) value).Sum(i => i.Value.Count);
155                    return vCount/allCount;
156                }
157            }
158            else
159            {
160                return 0;
161            }
162        }
163
164        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
165        {
166            throw new NotImplementedException();
167        }
168    }
169
170    [ValueConversion(typeof(Dictionary<long, Information>), typeof(Double))]
171    class MachineSumToProgressConverter : IValueConverter
172    {
173        public StatisticsPresentation StatisticsPresentation { get; set; }
174
175        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
176        {
177            if (StatisticsPresentation != null && StatisticsPresentation.MachineHierarchy != null)
178            {
179                lock (StatisticsPresentation)
180                {
181                    double allCount = (StatisticsPresentation.MachineHierarchy).Sum(i => i.Value.Sum);
182                    double vCount = (int) value;
183                    return vCount/allCount;
184                }
185            }
186            else
187            {
188                return 0;
189            }
190        }
191
192        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
193        {
194            throw new NotImplementedException();
195        }
196    }
197
198    [ValueConversion(typeof(string), typeof(Double))]
199    class ChunkSumConverter : IValueConverter
200    {
201        public StatisticsPresentation StatisticsPresentation { get; set; }
202
203        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
204        {
205            if (StatisticsPresentation != null && StatisticsPresentation.Statistics != null)
206            {
207                lock (StatisticsPresentation)
208                {
209                    string key = (string) value;
210                    var data = (StatisticsPresentation.Statistics)[key];
211                    return data.Sum(i => i.Value.Count);
212                }
213            }
214            else
215            {
216                return 0;
217            }
218        }
219
220        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
221        {
222            throw new NotImplementedException();
223        }
224    }
225
226    [ValueConversion(typeof(string), typeof(string))]
227    class StringLengthConverter : IValueConverter
228    {
229        public StatisticsPresentation StatisticsPresentation { get; set; }
230
231        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
232        {
233            if (StatisticsPresentation != null)
234            {
235                string name = (string)value;
236               
237                if(name.Length < 13)
238                {
239                    return name;
240                }
241                else
242                {
243                    return string.Format("{0}...", name.Substring(0, 9));
244                }
245            }
246            else
247            {
248                return "";
249            }
250        }
251
252        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
253        {
254            throw new NotImplementedException();
255        }
256    }
257
258    [ValueConversion(typeof(Int32), typeof(Double))]
259    class InformationToProgressConverter2 : IValueConverter
260    {
261        public StatisticsPresentation StatisticsPresentation { get; set; }
262
263        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
264        {
265            if (StatisticsPresentation != null && StatisticsPresentation.Statistics != null)
266            {
267                lock (StatisticsPresentation)
268                {
269                    double allCount = (StatisticsPresentation.Statistics).Sum(i => i.Value.Sum(j => j.Value.Count));
270                    return (int) value/allCount;
271                }
272            }
273            else
274            {
275                return 0;
276            }
277        }
278
279        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
280        {
281            throw new NotImplementedException();
282        }
283    }
284
285    public class ColorToDateConverter : IMultiValueConverter
286    {
287        public static SolidColorBrush[] AlternationColors = {Brushes.LimeGreen, Brushes.Red, Brushes.Blue};
288
289        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
290        {
291            DateTime date = (DateTime) values[0];
292            SolidColorBrush brush = ColorToDateConverter.AlternationColors[(int) values[1]].Clone();
293            TimeSpan diff = DateTime.UtcNow.Subtract(date);
294
295            Color color;
296            if (diff >= TimeSpan.FromDays(4))
297            {
298                color = Color.FromArgb(
299                    (byte)50,
300                    brush.Color.R, 
301                    brush.Color.G, 
302                    brush.Color.B);
303
304                brush.Color = color;
305                return brush;
306            }
307
308            if (diff >= TimeSpan.FromDays(3))
309            {
310                 color = Color.FromArgb(
311                    (byte)100,
312                    brush.Color.R, 
313                    brush.Color.G, 
314                    brush.Color.B);
315
316                brush.Color = color;
317                return brush;
318            }
319
320            if (diff >= TimeSpan.FromDays(2))
321            {
322                 color = Color.FromArgb(
323                    (byte)150,
324                    brush.Color.R, 
325                    brush.Color.G, 
326                    brush.Color.B);
327
328                brush.Color = color;
329                return brush;
330            }
331
332            if (diff >= TimeSpan.FromDays(1))
333            {
334                color = Color.FromArgb(
335                    (byte)200,
336                    brush.Color.R, 
337                    brush.Color.G, 
338                    brush.Color.B);
339
340                brush.Color = color;
341                return brush;
342            }
343
344            if (diff >= TimeSpan.FromDays(0))
345            {
346
347                color = Color.FromArgb(
348                    (byte)255,
349                    brush.Color.R,
350                    brush.Color.G,
351                    brush.Color.B);
352
353                brush.Color = color;
354                return brush;
355            }
356            return Brushes.AntiqueWhite;
357        }
358
359        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
360        {
361            throw new NotImplementedException();
362        }
363    }
364    #endregion
365
366}
Note: See TracBrowser for help on using the repository browser.