package edu.stanford.hci.flowmap.structure; import java.util.ArrayDeque; import java.util.Collection; import java.util.Deque; import java.util.HashSet; import java.util.LinkedList; /** * This software is distributed under the Berkeley Software Distribution License. * Please see http://graphics.stanford.edu/~dphan/code/bsd.license.html * */ public class Graph { /** * Records the min, max, and total values for the weight values. */ protected class MinMaxTotal { private double low, high, total; protected MinMaxTotal() { low = Double.MAX_VALUE; high = Double.MIN_VALUE; total = 0; } protected double getMin() { return low; } protected double getMax() { return high; } protected double getTotal() { return total; } protected void update(double val) { if (val < low) { low = val; } if (val > high) { high = low; } total += val; } } private Node rootNode; private LinkedList<Node> allNodes; private MinMaxTotal minMaxTotal; public Graph() { rootNode = null; allNodes = new LinkedList<Node>(); minMaxTotal = new MinMaxTotal(); } public Node getRootNode() { return rootNode; } public void setRootNode(Node n) { rootNode = n; } public Collection<Node> getAllNodes() { return allNodes; } public void addNode(Node n) { allNodes.add(n); minMaxTotal.update(n.getWeight()); } public Collection<Edge> getEdges() { HashSet<Edge> edges = new HashSet<Edge>(); Deque<Node> queue = new ArrayDeque<Node>(); queue.add(getRootNode()); while(!queue.isEmpty()) { Node node = queue.pop(); Collection<Edge> outEdges = node.getOutEdges(); for(Edge each: outEdges) { queue.add(each.getSecondNode()); } edges.addAll(outEdges); } return edges; } public double getTotalWeightValue() { return minMaxTotal.getTotal(); } public double getMinWeightValue() { return minMaxTotal.getMin(); } }