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

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

o Refactored distributed KeySearcher: updated directory structure and variable names

File size: 4.6 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Numerics;
4using Cryptool.PluginBase;
5using KeySearcher.Helper;
6using KeySearcher.KeyPattern;
7using KeySearcher.P2P.Exceptions;
8using KeySearcher.P2P.Storage;
9using KeySearcher.P2P.Tree;
10
11namespace KeySearcher.P2P
12{
13    internal class DistributedBruteForceManager
14    {
15        private readonly StorageKeyGenerator keyGenerator;
16        private readonly KeyPoolTree keyPoolTree;
17        private readonly KeySearcher keySearcher;
18        private readonly KeyPatternPool patternPool;
19
20        public DistributedBruteForceManager(KeySearcher keySearcher, KeyPattern.KeyPattern keyPattern, KeySearcherSettings settings,
21                                            KeyQualityHelper keyQualityHelper)
22        {
23            this.keySearcher = keySearcher;
24
25            // TODO when setting is still default (21), it is only displayed as 21 - but the settings-instance contains 0 for that key!
26            if (settings.ChunkSize == 0)
27            {
28                settings.ChunkSize = 21;
29            }
30
31            keyGenerator = new StorageKeyGenerator(keySearcher, settings);
32            patternPool = new KeyPatternPool(keyPattern, new BigInteger(Math.Pow(2, settings.ChunkSize)));
33            keyPoolTree = new KeyPoolTree(patternPool, this.keySearcher, keyQualityHelper, keyGenerator);
34
35            keySearcher.GuiLogMessage(
36                "Total amount of patterns: " + patternPool.Length + ", each containing " + patternPool.PartSize +
37                " keys.", NotificationLevel.Info);
38        }
39
40        public void Execute()
41        {
42            Leaf currentLeaf;
43            while (!keySearcher.stop)
44            {
45                try
46                {
47                    currentLeaf = keyPoolTree.FindNextLeaf();
48                    if (currentLeaf == null)
49                    {
50                        break;
51                    }
52                }
53                catch (AlreadyCalculatedException)
54                {
55                    keySearcher.GuiLogMessage("Node was already calculated.", NotificationLevel.Warning);
56                    keyPoolTree.Reset();
57                    continue;
58                }
59
60                if (!currentLeaf.ReserveLeaf())
61                {
62                    keySearcher.GuiLogMessage(
63                        "Pattern #" + currentLeaf.PatternId() +
64                        " was reserved before it could be reserved for this CrypTool instance.",
65                        NotificationLevel.Warning);
66                    keyPoolTree.Reset();
67                    continue;
68                }
69
70                keySearcher.GuiLogMessage(
71                    "Running pattern #" + (currentLeaf.PatternId() + 1) + " of " + patternPool.Length,
72                    NotificationLevel.Info);
73
74                try
75                {
76                    LinkedList<KeySearcher.ValueKey> result =
77                        keySearcher.BruteForceWithLocalSystem(patternPool[currentLeaf.PatternId()]);
78
79                    if (!keySearcher.stop)
80                        KeyPoolTree.ProcessCurrentPatternCalculationResult(currentLeaf, result);
81                    else
82                        keySearcher.GuiLogMessage("Brute force was stopped, not saving results...",
83                                                  NotificationLevel.Info);
84
85                    keySearcher.GuiLogMessage(
86                        string.Format("Best match: {0} with {1}", result.First.Value.key, result.First.Value.value),
87                        NotificationLevel.Info);
88                }
89                catch (ReservationRemovedException)
90                {
91                    keySearcher.GuiLogMessage("Reservation removed by another node (while calculating). " +
92                                              "To avoid a state in limbo, proceeding to first available leaf...",
93                                              NotificationLevel.Warning);
94                    keyPoolTree.Reset();
95                    continue;
96                }
97                catch (UpdateFailedException e)
98                {
99                    keySearcher.GuiLogMessage("Could not store results: " + e.Message, NotificationLevel.Warning);
100                    keyPoolTree.Reset();
101                    continue;
102                }
103            }
104
105            // Set progress to 100%
106            if (!keySearcher.stop && keyPoolTree.IsCalculationFinished())
107            {
108                keySearcher.showProgress(keySearcher.costList, 1, 1, 1);
109                keySearcher.GuiLogMessage("Calculation complete.", NotificationLevel.Info);
110            }
111        }
112    }
113}
Note: See TracBrowser for help on using the repository browser.