source: trunk/CrypPlugins/KeySearcher/P2P/DistributedBruteForceManager.cs @ 1707

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

o KeySearcher: more precise statistics in the new visualization of distributed search

File size: 7.7 KB
Line 
1using System;
2using System.Diagnostics;
3using System.Numerics;
4using System.Windows.Threading;
5using Cryptool.P2P;
6using Cryptool.PluginBase;
7using KeySearcher.Helper;
8using KeySearcher.KeyPattern;
9using KeySearcher.P2P.Exceptions;
10using KeySearcher.P2P.Helper;
11using KeySearcher.P2P.Presentation;
12using KeySearcher.P2P.Storage;
13using KeySearcher.P2P.Tree;
14using KeySearcherPresentation.Controls;
15
16namespace KeySearcher.P2P
17{
18    internal class DistributedBruteForceManager
19    {
20        private readonly StorageKeyGenerator keyGenerator;
21        private readonly KeySearcher keySearcher;
22        private readonly KeySearcherSettings settings;
23        private readonly KeyQualityHelper keyQualityHelper;
24        private readonly P2PQuickWatchPresentation quickWatch;
25        private readonly KeyPatternPool patternPool;
26        private readonly StatusContainer status;
27        internal readonly StatisticsGenerator StatisticsGenerator;
28        internal readonly Stopwatch StopWatch;
29
30        private KeyPoolTree keyPoolTree;
31
32        public DistributedBruteForceManager(KeySearcher keySearcher, KeyPattern.KeyPattern keyPattern, KeySearcherSettings settings,
33                                            KeyQualityHelper keyQualityHelper, P2PQuickWatchPresentation quickWatch)
34        {
35            this.keySearcher = keySearcher;
36            this.settings = settings;
37            this.keyQualityHelper = keyQualityHelper;
38            this.quickWatch = quickWatch;
39
40            // TODO when setting is still default (21), it is only displayed as 21 - but the settings-instance contains 0 for that key!
41            if (settings.ChunkSize == 0)
42            {
43                settings.ChunkSize = 21;
44            }
45
46            StopWatch = new Stopwatch();
47            status = new StatusContainer();
48            status.IsCurrentProgressIndeterminate = true;
49
50            keyGenerator = new StorageKeyGenerator(keySearcher, settings);
51            patternPool = new KeyPatternPool(keyPattern, new BigInteger(Math.Pow(2, settings.ChunkSize)));
52            StatisticsGenerator = new StatisticsGenerator(status, quickWatch, keySearcher, settings, this);
53            quickWatch.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(UpdateStatusContainerInQuickWatch));
54        }
55
56        public void Execute()
57        {
58            status.CurrentOperation = "Initializing connection to the peer-to-peer system";
59            new ConnectionHelper(keySearcher, settings).ValidateConnectionToPeerToPeerSystem();
60
61            if (!P2PManager.IsConnected)
62            {
63                keySearcher.GuiLogMessage("Unable to use peer-to-peer system.", NotificationLevel.Error);
64                return;
65            }
66
67            status.CurrentOperation = "Initializing distributed key pool tree";
68            keyPoolTree = new KeyPoolTree(patternPool, this.keySearcher, keyQualityHelper, keyGenerator, status, StatisticsGenerator);
69
70            keySearcher.GuiLogMessage(
71                "Total amount of patterns: " + patternPool.Length + ", each containing " + patternPool.PartSize +
72                " keys.", NotificationLevel.Info);
73            status.CurrentOperation = "Ready for calculation";
74
75            status.StartDate = keyPoolTree.StartDate();
76
77            Leaf currentLeaf;
78            while (!keySearcher.stop)
79            {
80                status.IsCurrentProgressIndeterminate = true;
81
82                try
83                {
84                    status.CurrentOperation = "Finding next leaf to calculate";
85                    currentLeaf = keyPoolTree.FindNextLeaf();
86                    if (currentLeaf == null)
87                    {
88                        break;
89                    }
90                }
91                catch (AlreadyCalculatedException)
92                {
93                    keySearcher.GuiLogMessage("Node was already calculated.", NotificationLevel.Info);
94                    keyPoolTree.Reset();
95                    continue;
96                }
97
98                status.CurrentOperation = "Calculating global statistics";
99                StatisticsGenerator.CalculateGlobalStatistics(currentLeaf.PatternId());
100                if (!currentLeaf.ReserveLeaf())
101                {
102                    keySearcher.GuiLogMessage(
103                        "Pattern #" + currentLeaf.PatternId() +
104                        " was reserved before it could be reserved for this CrypTool instance.",
105                        NotificationLevel.Info);
106                    keyPoolTree.Reset();
107                    continue;
108                }
109
110                keySearcher.GuiLogMessage(
111                    "Running pattern #" + (currentLeaf.PatternId() + 1) + " of " + patternPool.Length,
112                    NotificationLevel.Info);
113                status.CurrentChunk = currentLeaf.PatternId() + 1;
114                status.CurrentOperation = "Calculating pattern " + status.CurrentChunk;
115
116                try
117                {
118                    status.IsCurrentProgressIndeterminate = false;
119                    StopWatch.Start();
120                    var result = keySearcher.BruteForceWithLocalSystem(patternPool[currentLeaf.PatternId()], true);
121                    StopWatch.Stop();
122                    status.IsCurrentProgressIndeterminate = true;
123
124                    if (!keySearcher.stop)
125                    {
126                        status.CurrentOperation = "Processing results of calculation";
127                        KeyPoolTree.ProcessCurrentPatternCalculationResult(currentLeaf, result);
128                        StatisticsGenerator.ProcessPatternResults(result);
129                       
130                        status.LocalFinishedChunks++;
131                        keySearcher.GuiLogMessage(
132                            string.Format("Best match: {0} with {1}", result.First.Value.key, result.First.Value.value),
133                            NotificationLevel.Info);
134                    }
135                    else
136                    {
137                        keySearcher.GuiLogMessage("Brute force was stopped, not saving results...",
138                                                  NotificationLevel.Info);
139                        status.ProgressOfCurrentChunk = 0;
140                    }
141                }
142                catch (ReservationRemovedException)
143                {
144                    keySearcher.GuiLogMessage("Reservation removed by another node (while calculating). " +
145                                              "To avoid a state in limbo, proceeding to first available leaf...",
146                                              NotificationLevel.Info);
147                    keyPoolTree.Reset();
148                    continue;
149                }
150                catch (UpdateFailedException e)
151                {
152                    keySearcher.GuiLogMessage("Could not store results: " + e.Message, NotificationLevel.Info);
153                    keyPoolTree.Reset();
154                    continue;
155                }
156            }
157
158            // Set progress to 100%
159            if (!keySearcher.stop && keyPoolTree.IsCalculationFinished())
160            {
161                keySearcher.showProgress(keySearcher.costList, 1, 1, 1);
162                keySearcher.GuiLogMessage("Calculation complete.", NotificationLevel.Info);
163               
164            }
165
166            status.ProgressOfCurrentChunk = 0;
167            status.IsSearchingForReservedNodes = false;
168            status.IsCurrentProgressIndeterminate = false;
169            status.CurrentOperation = "Idle";
170            status.RemainingTimeTotal = new TimeSpan(0);
171        }
172
173        private void UpdateStatusContainerInQuickWatch()
174        {
175            quickWatch.DataContext = status;
176            quickWatch.UpdateSettings(keySearcher, settings);
177        }
178    }
179}
Note: See TracBrowser for help on using the repository browser.