private void clear() { var comparer1 = EqualityComparer <TLabel> .Default; var comparer2 = new Utils.HashSetEqualityComparer <Tuple <TLabel, int> >(); var comparer = new Utils.PairEqualityComparer <TLabel, HashSet <Tuple <TLabel, int> > >(comparer1, comparer2); partition = new Dictionary <TNode, int>(); partitionMap = new Dictionary <Tuple <TLabel, HashSet <Tuple <TLabel, int> > >, int>(comparer); int counter = 0; foreach (var node in graph.Nodes) { if (owner[node] == this) { var signature = Tuple.Create(graph.NodeLabel(node), new HashSet <Tuple <TLabel, int> >()); if (!partitionMap.ContainsKey(signature)) { partitionMap.Add(signature, counter++); } partition.Add(node, partitionMap[signature]); } } }
protected override void OnReceive(AbstractMessage message) { TypeSwitch.On(message) .Case((CoordinatorMessage coordinatorMessage) => { k_max = 0; partition = new Dictionary <TNode, int>(); oldNumBlocks = 0; blocks = new HashSet <int>(); workers = coordinatorMessage.Workers; state = new Dictionary <AbstractMachine, WorkerState>(); var comparer1 = EqualityComparer <TLabel> .Default; var comparer2 = new Utils.HashSetEqualityComparer <Tuple <TLabel, int> >(); var comparer = new Utils.PairEqualityComparer <TLabel, HashSet <Tuple <TLabel, int> > >(comparer1, comparer2); signatures = new Dictionary <Tuple <TLabel, HashSet <Tuple <TLabel, int> > >, int>(comparer); counter = 0; foreach (var worker in workers) { state.Add(worker, WorkerState.Refining); worker.SendMe(new ClearMessage(this)); } }) .Case((ExactRefinedMessage <TLabel> refinedMessage) => { state[refinedMessage.Sender] = WorkerState.Waiting; var remap = new Dictionary <int, int>(); foreach (var kvp in refinedMessage.PartitionMap) { if (!signatures.ContainsKey(kvp.Key)) { signatures.Add(kvp.Key, counter++); } remap.Add(kvp.Value, signatures[kvp.Key]); } refinedMessage.Sender.SendMe(new RemapPartitionMessage(this, remap)); if (workers.All(worker => state[worker] == WorkerState.Waiting)) { signatures.Clear(); // All workers have refined, now perform a share step foreach (var worker in workers) { state[worker] = WorkerState.Sharing; worker.SendMe(new ShareMessage(this)); } } }) .Case((SharedMessage sharedMessage) => { state[sharedMessage.Sender] = WorkerState.Waiting; if (workers.All(worker => state[worker] == WorkerState.Waiting)) { // All workers have shared, now count the number of unqiue blocks oldNumBlocks = blocks.Count; blocks.Clear(); foreach (var worker in workers) { state[worker] = WorkerState.Counting; worker.SendMe(new CountMessage(this)); } } }) .Case((CountedMessage countedMessage) => { state[countedMessage.Sender] = WorkerState.Waiting; blocks.UnionWith(countedMessage.Blocks); if (workers.All(worker => state[worker] == WorkerState.Waiting)) { if (blocks.Count > oldNumBlocks) { // There was a change, continue refining k_max += 1; foreach (var worker in workers) { state[worker] = WorkerState.Refining; worker.SendMe(new RefineMessage(this)); } } else { // We're done, collect global partition k_max -= 1; foreach (var worker in workers) { state[worker] = WorkerState.Collecting; worker.SendMe(new SegmentRequestMessage(this)); } } } }) .Case((SegmentResponseMessage <TNode> segmentResponseMessage) => { state[segmentResponseMessage.Sender] = WorkerState.Waiting; foreach (var pair in segmentResponseMessage.Pairs) { partition.Add(pair.Key, pair.Value); } if (workers.All(worker => state[worker] == WorkerState.Waiting)) { onComplete(k_max, partition); } }); }