source: trunk/CrypPlugins/KeySearcher/P2P/Presentation/StatisticsGenerator.cs @ 1693

Last change on this file since 1693 was 1693, checked in by Paul Lelgemann, 12 years ago

o Work on the distributed KeySearcher cache

File size: 7.7 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Diagnostics;
4using System.Numerics;
5using System.Text;
6using System.Threading;
7using System.Windows.Threading;
8using KeySearcher.KeyPattern;
9using KeySearcherPresentation.Controls;
10
11namespace KeySearcher.P2P.Presentation
12{
13    class StatisticsGenerator
14    {
15        private readonly StatusContainer status;
16        private readonly P2PQuickWatchPresentation quickWatch;
17        private readonly KeySearcher keySearcher;
18        private readonly DistributedBruteForceManager distributedBruteForceManager;
19        private readonly BigInteger totalAmountOfChunks;
20        private readonly Stopwatch stopWatch;
21
22        private DateTime lastDateOfGlobalStatistics;
23        private BigInteger highestChunkCalculated;
24        private BigInteger totalRequestsAtStartOfNodeSearch;
25
26        public StatisticsGenerator(StatusContainer status, P2PQuickWatchPresentation quickWatch, KeySearcher keySearcher, KeySearcherSettings settings, DistributedBruteForceManager distributedBruteForceManager)
27        {
28            this.status = status;
29            this.quickWatch = quickWatch;
30            this.keySearcher = keySearcher;
31            this.distributedBruteForceManager = distributedBruteForceManager;
32
33            lastDateOfGlobalStatistics = DateTime.Now;
34            highestChunkCalculated = -1;
35            stopWatch = new Stopwatch();
36
37            var keyPattern = new KeyPattern.KeyPattern(keySearcher.ControlMaster.getKeyPattern())
38                                 {WildcardKey = settings.Key};
39            var keysPerChunk = Math.Pow(2, settings.ChunkSize);
40            var keyPatternPool = new KeyPatternPool(keyPattern, new BigInteger(keysPerChunk));
41
42            totalAmountOfChunks = keyPatternPool.Length;
43
44            status.PropertyChanged += StatusPropertyChanged;
45        }
46
47        void StatusPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
48        {
49            if (e.PropertyName != "DhtOverheadInReadableTime") return;
50
51            if (distributedBruteForceManager.StopWatch.Elapsed.Ticks == 0)
52            {
53                status.DhtOverheadInPercent = "0 %";
54                return;
55            }
56
57            var overheadInTicks = (double) status.DhtOverheadInReadableTime.Ticks/
58                           distributedBruteForceManager.StopWatch.Elapsed.Ticks;
59            var overheadInPercent = Math.Round(overheadInTicks, 2);
60            overheadInPercent *= 100;
61            status.DhtOverheadInPercent = overheadInPercent + " %";
62        }
63
64        public void MarkStartOfNodeSearch()
65        {
66            totalRequestsAtStartOfNodeSearch = status.TotalDhtRequests;
67            stopWatch.Start();
68        }
69
70        public void MarkEndOfNodeSearch()
71        {
72            stopWatch.Stop();
73            var elapsedTime = stopWatch.Elapsed.Add(status.DhtOverheadInReadableTime);
74            status.DhtOverheadInReadableTime = new TimeSpan(((long) Math.Round((1.0*elapsedTime.Ticks/5))*5));
75            stopWatch.Reset();
76           
77            var requestsForThisNode = status.TotalDhtRequests - totalRequestsAtStartOfNodeSearch;
78
79            if (status.RequestsPerNode == 0)
80            {
81                status.RequestsPerNode = requestsForThisNode;
82                return;
83            }
84
85            status.RequestsPerNode = (status.RequestsPerNode + requestsForThisNode)/2;
86        }
87
88        public void CalculateGlobalStatistics(BigInteger nextChunk)
89        {
90            if (highestChunkCalculated == -1) highestChunkCalculated = nextChunk;
91            if (nextChunk <= highestChunkCalculated) return;
92
93            var totalAmountOfParticipants = nextChunk - highestChunkCalculated;
94            status.TotalAmountOfParticipants = totalAmountOfParticipants;
95
96            var timeUsedForLatestProgress = DateTime.Now.Subtract(lastDateOfGlobalStatistics);
97            var secondsForOneChunk = timeUsedForLatestProgress.TotalSeconds/(double) totalAmountOfParticipants;
98            var remainingChunks = totalAmountOfChunks - nextChunk;
99            var secondsRemaining = (double) remainingChunks*secondsForOneChunk;
100
101            try
102            {
103                status.EstimatedFinishDate = DateTime.Now.AddSeconds(secondsRemaining).ToString("dd.MM. HH:mm");
104            }
105            catch (ArgumentOutOfRangeException)
106            {
107                status.EstimatedFinishDate = "~";
108            }
109
110            lastDateOfGlobalStatistics = DateTime.Now;
111
112            highestChunkCalculated = nextChunk;
113            var globalProgressValue = (double) highestChunkCalculated/(double) totalAmountOfChunks;
114            keySearcher.ProgressChanged(globalProgressValue, 1);
115        }
116
117        public void ProcessPatternResults(LinkedList<KeySearcher.ValueKey> result)
118        {
119            ProcessResultList(result);
120        }
121
122        public void ShowProgress(LinkedList<KeySearcher.ValueKey> bestResultList, BigInteger keysInThisChunk, BigInteger keysFinishedInThisChunk, BigInteger keysPerSecond)
123        {
124            status.ProgressOfCurrentChunk = (double) keysFinishedInThisChunk/(double) keysInThisChunk;
125            status.KeysPerSecond = keysPerSecond;
126
127            var time = (Math.Pow(10, BigInteger.Log((keysInThisChunk - keysFinishedInThisChunk), 10) - BigInteger.Log(keysPerSecond, 10)));
128            var timeleft = new TimeSpan(-1);
129
130            try
131            {
132                if (time / (24 * 60 * 60) <= int.MaxValue)
133                {
134                    int days = (int)(time / (24 * 60 * 60));
135                    time = time - (days * 24 * 60 * 60);
136                    int hours = (int)(time / (60 * 60));
137                    time = time - (hours * 60 * 60);
138                    int minutes = (int)(time / 60);
139                    time = time - (minutes * 60);
140                    int seconds = (int)time;
141
142                    timeleft = new TimeSpan(days, hours, minutes, (int)seconds, 0);
143                }
144            }
145            catch
146            {
147                //can not calculate time span
148            }
149
150            if (timeleft != new TimeSpan(-1))
151            {
152                status.RemainingTime = timeleft.ToString();
153            } 
154            else
155            {
156                status.RemainingTime = "~";
157            }
158
159            ProcessResultList(bestResultList);
160        }
161
162        private void ProcessResultList(LinkedList<KeySearcher.ValueKey> bestResultList)
163        {
164            quickWatch.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
165            {
166
167                var enc = Encoding.Default;
168                LinkedListNode<KeySearcher.ValueKey> linkedListNode;
169                status.TopList.Clear();
170                linkedListNode = bestResultList.First;
171
172                int i = 0;
173                while (linkedListNode != null)
174                {
175                    i++;
176
177                    var entry = new ResultEntry();
178                    entry.Ranking = i.ToString();
179                    entry.Value = Math.Round(linkedListNode.Value.value, 2).ToString();
180                    entry.Key = linkedListNode.Value.key;
181                    var plainText = enc.GetString(linkedListNode.Value.decryption);
182
183                    const string replaceWith = "";
184                    plainText = plainText.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);
185                    if (plainText.Length > 30)
186                        plainText = plainText.Substring(0, 30) + "...";
187
188                    entry.Text = plainText;
189
190                    status.TopList.Add(entry);
191                    linkedListNode = linkedListNode.Next;
192                }
193            }, null);
194        }
195    }
196}
Note: See TracBrowser for help on using the repository browser.