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

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

o P2PEditor: fix for local filename problem
+ KeySearcher: debug log entry for sent/received bytes

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