// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.JunctionChecker.junctionchecking;
import java.util.ArrayList;
import org.openstreetmap.josm.plugins.JunctionChecker.connectedness.BacktrackingColors;
import org.openstreetmap.josm.plugins.JunctionChecker.datastructure.Channel;
import org.openstreetmap.josm.plugins.JunctionChecker.datastructure.ChannelDiGraph;
import org.openstreetmap.josm.plugins.JunctionChecker.datastructure.LeadsTo;
/**
* erzeugt
* @author joerg
*/
public class JProcess {
private ArrayList<Channel> vertices;
private ChannelDiGraph digraph;
private TRDFS trdfs;
private BackPropagation backpropagation;
private ArrayList<LeadsTo> cycleEdges;
public JProcess(ArrayList<Channel> subgraph, ChannelDiGraph digraph) {
this.digraph = digraph;
this.vertices = subgraph;
this.trdfs = new TRDFS(vertices, digraph);
this.backpropagation = new BackPropagation(digraph);
}
/**
* ruft den TR-DFS und danach den Backpropagation-Algorithmus auf jPrepare
* muß vorher durchgelaufen sein (die Eingänge müssen bekannt sein)
*/
public void jProcess(ArrayList<Channel> entries) {
ArrayList<Channel> nodes = digraph.getChannels();
// alle Knoten des Subgraphen auf unbesucht stellen und
// die evtl. gespeicherten erreichbaren Knoten löschen
for (int i = 0; i < nodes.size(); i++) {
nodes.get(i).setVisited(BacktrackingColors.WHITE);
nodes.get(i).ereaseReachableNodes();
}
// alle Kanten auf keine ForwardEdge stellen
for (int i = 0; i < digraph.getLeadsTo().size(); i++) {
digraph.getLeadsTo().get(i).setForwardEdge(false);
}
trdfs.ereaseCycleEdges();
for (int i = 0; i < entries.size(); i++) {
if (entries.get(i).getVisited() == BacktrackingColors.WHITE) {
trdfs.trdfs(entries.get(i));
}
}
cycleEdges = trdfs.getCycleEdges();
for (int j = 0; j < cycleEdges.size(); j++) {
backpropagation.backPropagation(cycleEdges.get(j).getFromChannel(),
cycleEdges.get(j).getToChannel(), cycleEdges.get(j).getToChannel());
}
}
}