private void GetGraphOrder(out OneToManyMap <GraphMap <FeatureVector, WeightMatrix> .ILinkable, Pair <GraphMap <FeatureVector, WeightMatrix> .ILinkable, GraphMap <FeatureVector, WeightMatrix> .Link <WeightMatrix> > > backwards, out Queue <GraphMap <FeatureVector, WeightMatrix> .ILinkable> inputVectors, out Queue <GraphMap <FeatureVector, WeightMatrix> .ILinkable> outputVectors) { backwards = new OneToManyMap <GraphMap <FeatureVector, WeightMatrix> .ILinkable, Pair <GraphMap <FeatureVector, WeightMatrix> .ILinkable, GraphMap <FeatureVector, WeightMatrix> .Link <WeightMatrix> > >(); // Just to keep track of the frontier Queue <GraphMap <FeatureVector, WeightMatrix> .ILinkable> queue = new Queue <GraphMap <FeatureVector, WeightMatrix> .ILinkable>(); // To keep track of the order each output should be evaluated Dictionary <GraphMap <FeatureVector, WeightMatrix> .ILinkable, int> outputPriorities = new Dictionary <GraphMap <FeatureVector, WeightMatrix> .ILinkable, int>(); Dictionary <GraphMap <FeatureVector, WeightMatrix> .ILinkable, int> inputPriorities = new Dictionary <GraphMap <FeatureVector, WeightMatrix> .ILinkable, int>(); foreach (var input in inputs) { queue.Enqueue(input); } int outPriority = 0; while (queue.Count != 0) { var node = queue.Dequeue(); foreach (var edge in node.Edges) { // add next node to the frontier queue.Enqueue((GraphMap <FeatureVector, WeightMatrix> .ILinkable)edge.Key); // put this node in the set of outputs outputPriorities[(GraphMap <FeatureVector, WeightMatrix> .ILinkable)edge.Key] = outPriority++; backwards.Add((GraphMap <FeatureVector, WeightMatrix> .ILinkable)edge.Key, new Pair <GraphMap <FeatureVector, WeightMatrix> .ILinkable, GraphMap <FeatureVector, WeightMatrix> .Link <WeightMatrix> >() { a = node, b = edge.Value }); } } // Vectors that receive outputs outputVectors = new Queue <GraphMap <FeatureVector, WeightMatrix> .ILinkable>(); // Vectors that are inputs inputVectors = new Queue <GraphMap <FeatureVector, WeightMatrix> .ILinkable>(); int inPriority = 0; foreach (var outputPriority in outputPriorities.OrderBy(x => x.Value)) { outputVectors.Enqueue(outputPriority.Key); foreach (var input in backwards[outputPriority.Key]) { inputPriorities[input.a] = inPriority++; } } foreach (var inputPriority in inputPriorities.OrderByDescending(x => x.Value)) { inputVectors.Enqueue(inputPriority.Key); } }
private void GetGraphOrder(out OneToManyMap<GraphMap<FeatureVector, WeightMatrix>.ILinkable, Pair<GraphMap<FeatureVector, WeightMatrix>.ILinkable, GraphMap<FeatureVector, WeightMatrix>.Link<WeightMatrix>>> backwards, out Queue<GraphMap<FeatureVector, WeightMatrix>.ILinkable> inputVectors, out Queue<GraphMap<FeatureVector, WeightMatrix>.ILinkable> outputVectors) { backwards = new OneToManyMap<GraphMap<FeatureVector, WeightMatrix>.ILinkable, Pair<GraphMap<FeatureVector, WeightMatrix>.ILinkable, GraphMap<FeatureVector, WeightMatrix>.Link<WeightMatrix>>>(); // Just to keep track of the frontier Queue<GraphMap<FeatureVector, WeightMatrix>.ILinkable> queue = new Queue<GraphMap<FeatureVector, WeightMatrix>.ILinkable>(); // To keep track of the order each output should be evaluated Dictionary<GraphMap<FeatureVector, WeightMatrix>.ILinkable, int> outputPriorities = new Dictionary<GraphMap<FeatureVector, WeightMatrix>.ILinkable, int>(); Dictionary<GraphMap<FeatureVector, WeightMatrix>.ILinkable, int> inputPriorities = new Dictionary<GraphMap<FeatureVector, WeightMatrix>.ILinkable, int>(); foreach (var input in inputs) { queue.Enqueue(input); } int outPriority = 0; while (queue.Count != 0) { var node = queue.Dequeue(); foreach (var edge in node.Edges) { // add next node to the frontier queue.Enqueue((GraphMap<FeatureVector, WeightMatrix>.ILinkable)edge.Key); // put this node in the set of outputs outputPriorities[(GraphMap<FeatureVector, WeightMatrix>.ILinkable)edge.Key] = outPriority++; backwards.Add((GraphMap<FeatureVector, WeightMatrix>.ILinkable)edge.Key, new Pair<GraphMap<FeatureVector, WeightMatrix>.ILinkable, GraphMap<FeatureVector, WeightMatrix>.Link<WeightMatrix>>() { a = node, b = edge.Value }); } } // Vectors that receive outputs outputVectors = new Queue<GraphMap<FeatureVector, WeightMatrix>.ILinkable>(); // Vectors that are inputs inputVectors = new Queue<GraphMap<FeatureVector, WeightMatrix>.ILinkable>(); int inPriority = 0; foreach (var outputPriority in outputPriorities.OrderBy(x => x.Value)) { outputVectors.Enqueue(outputPriority.Key); foreach (var input in backwards[outputPriority.Key]) { inputPriorities[input.a] = inPriority++; } } foreach (var inputPriority in inputPriorities.OrderByDescending(x => x.Value)) { inputVectors.Enqueue(inputPriority.Key); } }