public override void main()
        {
            Trace.WriteLine(Rank + ": START COMBINE FUNCTION #1");
            IIteratorInstance <ORV> input_data_instance = (IIteratorInstance <ORV>)Input_data.Instance;
            IKVPairInstance <IInteger, IIterator <IPathInfo> > output_data_instance = (IKVPairInstance <IInteger, IIterator <IPathInfo> >)Output_data.Instance;

            Trace.WriteLine(Rank + ": START COMBINE FUNCTION #2");
            IIntegerInstance done_flag = (IIntegerInstance)output_data_instance.Key;
            IIteratorInstance <IPathInfo> output_distances = (IIteratorInstance <IPathInfo>)output_data_instance.Value;

            Trace.WriteLine(Rank + ": START COMBINE FUNCTION #3");
            bool   done = true;
            object o;

            while (input_data_instance.fetch_next(out o))
            {
                IKVPairInstance <IInteger, IIterator <IPathInfo> > kv = (IKVPairInstance <IInteger, IIterator <IPathInfo> >)o;
                IIntegerInstance k = (IIntegerInstance)kv.Key;

                Trace.WriteLine(Rank + ": LOOP #1 COMBINE FUNCTION " + k.Value);

                output_distances.putAll((IIteratorInstance <IPathInfo>)kv.Value);

                done = done && k.Value == 1;
            }

            output_distances.finish();

            done_flag.Value = done ? 1 : 0;
            Trace.WriteLine(Rank + ": END COMBINE FUNCTION " + done);
        }
        public override void main()
        {
            int             done = 0;
            IStringInstance input_data_instance  = (IStringInstance)Input_data.Instance;
            IStringInstance output_data_instance = (IStringInstance)Output_data.Instance;
            IIteratorInstance <IPathInfo> initial_data_instance = (IIteratorInstance <IPathInfo>)Initial_data.Instance;
            IKVPairInstance <IInteger, IIterator <IPathInfo> > final_distances_instance = (IKVPairInstance <IInteger, IIterator <IPathInfo> >)Final_distances.Instance;
            IIntegerInstance termination_flag = (IIntegerInstance)Termination_flag.Instance;

            string setE = input_data_instance.Value;
            string setV = "1 c 0" + System.Environment.NewLine;
            IDictionary <int, int> vertices = new Dictionary <int, int>();

            foreach (string edge in setE.Split(System.Environment.NewLine.ToCharArray()))
            {
                if (edge.Length > 0)
                {
                    int vertex = edge [0];
                    if (!vertices.ContainsKey(vertex))
                    {
                        setV += edge [0] + " d " + int.MaxValue + System.Environment.NewLine;
                        vertices.Add(vertex, vertex);
                    }
                }
            }

            feedInitialData(setV + System.Environment.NewLine + setE, initial_data_instance);

            int count = 0;

            while (done == 0)
            {
                Console.WriteLine(Rank + ": ITERATION PATH_FLOW FAST GO ! - " + (++count));

                this.Path_flow.go();

                done = ((IIntegerInstance)final_distances_instance.Key).Value;

                termination_flag.Value = done;
                Set_termination_flag.go();

                if (done == 0)
                {
                    Trace.WriteLine(Rank + ": Exchange #1");
                    initial_data_instance.putAll((IIteratorInstance <IPathInfo>)final_distances_instance.Value);
                    initial_data_instance.finish();
                    Trace.WriteLine(Rank + ": Exchange #2");
                }
            }

            outputFinalDistances((IIteratorInstance <IPathInfo>)final_distances_instance.Value, output_data_instance);

            Trace.WriteLine(Rank + ": --- FINISH PATH_FLOW.GO !");
        }