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