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

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

o Work on the distributed KeySearcher presentation

File size: 6.4 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Diagnostics;
4using System.Numerics;
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            keyGenerator = new StorageKeyGenerator(keySearcher, settings);
43            patternPool = new KeyPatternPool(keyPattern, new BigInteger(Math.Pow(2, settings.ChunkSize)));
44            status = new StatusContainer();
45            StatisticsGenerator = new StatisticsGenerator(status, quickWatch, keySearcher, settings, this);
46            keyPoolTree = new KeyPoolTree(patternPool, this.keySearcher, keyQualityHelper, keyGenerator, status, StatisticsGenerator);
47            StopWatch = new Stopwatch();
48
49            quickWatch.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(UpdateStatusContainerInQuickWatch));
50
51            keySearcher.GuiLogMessage(
52                "Total amount of patterns: " + patternPool.Length + ", each containing " + patternPool.PartSize +
53                " keys.", NotificationLevel.Info);
54        }
55
56        public void Execute()
57        {
58            Leaf currentLeaf;
59            while (!keySearcher.stop)
60            {
61                try
62                {
63                    currentLeaf = keyPoolTree.FindNextLeaf();
64                    if (currentLeaf == null)
65                    {
66                        break;
67                    }
68                }
69                catch (AlreadyCalculatedException)
70                {
71                    keySearcher.GuiLogMessage("Node was already calculated.", NotificationLevel.Warning);
72                    keyPoolTree.Reset();
73                    continue;
74                }
75
76                StatisticsGenerator.CalculateGlobalStatistics(currentLeaf.PatternId());
77                if (!currentLeaf.ReserveLeaf())
78                {
79                    keySearcher.GuiLogMessage(
80                        "Pattern #" + currentLeaf.PatternId() +
81                        " was reserved before it could be reserved for this CrypTool instance.",
82                        NotificationLevel.Warning);
83                    keyPoolTree.Reset();
84                    continue;
85                }
86
87                keySearcher.GuiLogMessage(
88                    "Running pattern #" + (currentLeaf.PatternId() + 1) + " of " + patternPool.Length,
89                    NotificationLevel.Info);
90                status.CurrentChunk = currentLeaf.PatternId() + 1;
91
92                try
93                {
94                    status.IsCurrentProgressIndeterminate = false;
95                    StopWatch.Start();
96                    var result = keySearcher.BruteForceWithLocalSystem(patternPool[currentLeaf.PatternId()], true);
97                    StopWatch.Stop();
98                    status.IsCurrentProgressIndeterminate = true;
99
100                    if (!keySearcher.stop)
101                    {
102                        KeyPoolTree.ProcessCurrentPatternCalculationResult(currentLeaf, result);
103                        StatisticsGenerator.ProcessPatternResults(result);
104                       
105                        status.LocalFinishedChunks++;
106                        keySearcher.GuiLogMessage(
107                        string.Format("Best match: {0} with {1}", result.First.Value.key, result.First.Value.value),
108                        NotificationLevel.Info);
109                    }
110                    else
111                    {
112                        keySearcher.GuiLogMessage("Brute force was stopped, not saving results...",
113                                                  NotificationLevel.Info);
114                        status.ProgressOfCurrentChunk = 0;
115                    }
116                }
117                catch (ReservationRemovedException)
118                {
119                    keySearcher.GuiLogMessage("Reservation removed by another node (while calculating). " +
120                                              "To avoid a state in limbo, proceeding to first available leaf...",
121                                              NotificationLevel.Warning);
122                    keyPoolTree.Reset();
123                    continue;
124                }
125                catch (UpdateFailedException e)
126                {
127                    keySearcher.GuiLogMessage("Could not store results: " + e.Message, NotificationLevel.Warning);
128                    keyPoolTree.Reset();
129                    continue;
130                }
131            }
132
133            // Set progress to 100%
134            if (!keySearcher.stop && keyPoolTree.IsCalculationFinished())
135            {
136                keySearcher.showProgress(keySearcher.costList, 1, 1, 1);
137                keySearcher.GuiLogMessage("Calculation complete.", NotificationLevel.Info);
138                status.ProgressOfCurrentChunk = 0;
139                status.IsSearchingForReservedNodes = false;
140            }
141        }
142
143        private void UpdateStatusContainerInQuickWatch()
144        {
145            quickWatch.DataContext = status;
146            quickWatch.UpdateSettings(keySearcher, settings);
147        }
148    }
149}
Note: See TracBrowser for help on using the repository browser.