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

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

o KeySearcher: improved visualization of local and distributed components

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