source: trunk/CrypPlugins/KeySearcher/P2P/Tree/NodeBase.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: 4.1 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Numerics;
4using Cryptool.P2P;
5using Cryptool.P2P.Internal;
6using KeySearcher.Helper;
7using KeySearcher.P2P.Exceptions;
8using KeySearcher.P2P.Storage;
9
10namespace KeySearcher.P2P.Tree
11{
12    abstract class NodeBase
13    {
14        protected internal readonly BigInteger From;
15        protected internal readonly BigInteger To;
16        protected internal readonly string DistributedJobIdentifier;
17        protected readonly StorageHelper StorageHelper;
18        protected readonly KeyQualityHelper KeyQualityHelper;
19
20        protected internal DateTime LastUpdate;
21
22        public readonly Node ParentNode;
23        public LinkedList<KeySearcher.ValueKey> Result;
24
25        protected NodeBase(StorageHelper storageHelper, KeyQualityHelper keyQualityHelper, Node parentNode, BigInteger @from, BigInteger to, string distributedJobIdentifier)
26        {
27            StorageHelper = storageHelper;
28            KeyQualityHelper = keyQualityHelper;
29            ParentNode = parentNode;
30            From = @from;
31            To = to;
32            DistributedJobIdentifier = distributedJobIdentifier;
33
34            LastUpdate = DateTime.MinValue;
35            Result = new LinkedList<KeySearcher.ValueKey>();
36
37            StorageHelper.UpdateFromDht(this);
38        }
39
40        protected void UpdateDht()
41        {
42            // If this instance is the root node, we need a special handling
43            if (ParentNode == null)
44            {
45                UpdateDhtForRootNode();
46                return;
47            }
48
49            // Compare with refreshed parent node
50            var result = StorageHelper.UpdateFromDht(ParentNode, true);
51            if (!result.IsSuccessful())
52            {
53                throw new UpdateFailedException("Parent node could not be updated: " + result.Status);
54            }
55
56            IntegrateResultsIntoParent();
57            ParentNode.ChildFinished(this);
58
59            if (StorageHelper.RetrieveWithStatistic(StorageHelper.KeyInDht(this)).Status == RequestResultType.KeyNotFound)
60            {
61                throw new ReservationRemovedException("Before updating parent node, this leaf's reservation was deleted.");
62            }
63
64            var updateResult = StorageHelper.UpdateInDht(ParentNode);
65            if (!updateResult.IsSuccessful())
66            {
67                throw new UpdateFailedException("Parent node could not be updated: " + updateResult.Status);
68            }
69
70            StorageHelper.RemoveWithStatistic(StorageHelper.KeyInDht(this));
71
72            if (ParentNode.IsCalculated())
73            {
74                ParentNode.UpdateDht();
75            }
76        }
77
78        private void IntegrateResultsIntoParent()
79        {
80            var bestValue = double.MinValue;
81            if (ParentNode.Result.Count > 0)
82            {
83                bestValue = ParentNode.Result.First.Value.value;
84            }
85
86            var revertedResults = new LinkedList<KeySearcher.ValueKey>();
87            foreach (var valueKey in Result)
88            {
89                revertedResults.AddFirst(valueKey);
90            }
91
92            foreach (var valueKey in revertedResults)
93            {
94                if (!KeyQualityHelper.IsBetter(valueKey.value, bestValue)) continue;
95
96                if (ParentNode.Result.Contains(valueKey)) continue;
97
98                ParentNode.Result.AddFirst(valueKey);
99                bestValue = valueKey.value;
100
101                if (ParentNode.Result.Count > 10)
102                {
103                    ParentNode.Result.RemoveLast();
104                }
105            }
106        }
107
108        private void UpdateDhtForRootNode()
109        {
110            StorageHelper.UpdateFromDht(this, true);
111            StorageHelper.UpdateInDht(this);
112        }
113
114        public abstract bool IsReserverd();
115
116        public abstract Leaf CalculatableLeaf(bool useReservedNodes);
117
118        public abstract bool IsCalculated();
119
120        public abstract void Reset();
121
122        public override string ToString()
123        {
124            return "NodeBase " + GetType() + ", from " + From + " to " + To;
125        }
126    }
127}
Note: See TracBrowser for help on using the repository browser.