コード例 #1
0
        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]);
                }
            }
        }
コード例 #2
0
        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);
                }
            });
        }