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 !"); }