package edu.isi.karma.modeling.steiner.topk; import java.util.LinkedList; import java.util.Set; import java.util.TreeSet; /** * This class represents a loose path, that is a path in which all intermediate nodes * have a degree 2, its end nodes have a degree > 2 (they are fixed nodes). * * @author kasneci * */ public class LoosePath extends SteinerSubTree implements Cloneable { //list of steiner nodes belonging to this loose path protected LinkedList<SteinerNode> pathNodes; public LoosePath(LinkedList<SteinerNode> pathNodes){ this.pathNodes=pathNodes; setScoreWithFunction(null); } public Set<SteinerNode> getNodes(){ Set<SteinerNode> nodeSet= new TreeSet<>(); nodeSet.addAll(pathNodes); return nodeSet; } // copying this loose path public SteinerSubTree clone(){ LinkedList<SteinerNode> l= new LinkedList<>(); for(SteinerNode n: pathNodes){ l.add(n.copy()); } return new LoosePath(l); } // adding an edge to the first node of the path public void addEdgeToFirstNode(SteinerEdge edge){ if(pathNodes.getFirst().equals(edge.sourceNode)){ pathNodes.getFirst().addEdge(edge.sinkNode, false, edge.label().name, edge.weight()); pathNodes.addFirst(edge.sinkNode); } if(pathNodes.getFirst().equals(edge.sinkNode)){ pathNodes.getFirst().addEdge(edge.sourceNode, true, edge.label().name, edge.weight()); pathNodes.addFirst(edge.sourceNode); } } public void addEdgeToFirstNode(SteinerNode n, boolean isSourceNode, String l, float weight){ if(isSourceNode) addEdgeToFirstNode(new SteinerEdge(n, l, pathNodes.getFirst(),weight)); else addEdgeToFirstNode(new SteinerEdge(pathNodes.getFirst(), l, n,weight)); } // adding an edge to the last node of the path public void addEdgeToLastNode(SteinerEdge edge){ if(pathNodes.getLast().equals(edge.sourceNode)){ pathNodes.getLast().addEdge(edge.sinkNode, false, edge.label().name,edge.weight()); pathNodes.addLast(edge.sinkNode); } if(pathNodes.getLast().equals(edge.sinkNode)){ pathNodes.getLast().addEdge(edge.sourceNode, true, edge.label().name, edge.weight()); pathNodes.addLast(edge.sourceNode); } } public void addEdgeToLastNode(SteinerNode n, boolean isSourceNode, String l, float weight){ if(isSourceNode) addEdgeToLastNode(new SteinerEdge(n, l, pathNodes.getFirst(),weight)); else addEdgeToLastNode(new SteinerEdge(pathNodes.getFirst(), l, n,weight)); } /** * * @return the LinkedList of SteinerNodes representing this loose path */ public LinkedList<SteinerNode> getPath(){ return pathNodes; } public SteinerNode getFirstNode(){ return pathNodes.getFirst(); } public SteinerNode getLastNode(){ return pathNodes.getLast(); } public boolean equals(Object o){ return this.compareTo((LoosePath)o)==0; } }