/* * Author: tdanford * Date: Nov 15, 2008 */ package org.seqcode.gseutils.graphs; import java.util.*; public class DirectedWeightedGraph extends DirectedGraph implements WeightedGraph { private Double defaultWeight; private Map<String,Double> nodeWeights; private Map<String,Map<String,Double>> edgeWeights; public DirectedWeightedGraph() { this(1.0); } public DirectedWeightedGraph(Double defaultWeight) { super(); this.defaultWeight = defaultWeight; nodeWeights = new HashMap<String,Double>(); edgeWeights = new HashMap<String,Map<String,Double>>(); } public DirectedWeightedGraph(DirectedGraph g, Double dweight) { super(g); defaultWeight = dweight; nodeWeights = new HashMap<String,Double>(); edgeWeights = new HashMap<String,Map<String,Double>>(); } public void removeVertex(String node) { super.removeVertex(node); if(nodeWeights.containsKey(node)) { nodeWeights.remove(node); } if(edgeWeights.containsKey(node)) { edgeWeights.remove(node); } for(String n : edgeWeights.keySet()) { if(edgeWeights.get(n).containsKey(node)) { edgeWeights.get(n).remove(node); } } } public void removeEdge(String n1, String n2) { super.removeEdge(n1, n2); if(edgeWeights.containsKey(n1) && edgeWeights.get(n1).containsKey(n2)) { edgeWeights.get(n1).remove(n2); if(edgeWeights.get(n1).isEmpty()) { edgeWeights.remove(n1); } } } public void removeEdges(String n1) { if(edgeWeights.containsKey(n1)) { edgeWeights.remove(n1); } for(String n2 : getNeighbors(n1)) { removeEdge(n1, n2); } } public void removeAllEdges() { super.removeAllEdges(); edgeWeights.clear(); } public void addWeightedEdge(String n1, String n2, Double w) { addEdge(n1, n2); setWeight(n1, n2, w); } public void setWeight(String node, Double w) { if(!getVertices().contains(node)) { throw new IllegalArgumentException(); } nodeWeights.put(node, w); } public void setWeight(String n1, String n2, Double w) { if(!isNeighbor(n1, n2)) { throw new IllegalArgumentException(); } if(!edgeWeights.containsKey(n1)) { edgeWeights.put(n1, new HashMap<String,Double>()); } edgeWeights.get(n1).put(n2, w); } public Double weight(String node) { return nodeWeights.containsKey(node) ? nodeWeights.get(node) : defaultWeight; } public Double weight(String n1, String n2) { if(edgeWeights.containsKey(n1) && edgeWeights.get(n1).containsKey(n2)) { return edgeWeights.get(n1).get(n2); } else { return defaultWeight; } } }