public static void assess(Graph graph) { Map<Integer, Integer> degreeCounts = new TreeMap<Integer, Integer>(); Map<Integer, Integer> longestPathLengthCounts = new TreeMap<Integer, Integer>(); for (Node node : graph.getNodeList()) { int degree = node.getEdgeList().size(); int longestPathLength = getLongestPathLength(node); increment(degreeCounts, degree); increment(longestPathLengthCounts, longestPathLength); } System.out.println("# nodes: " + graph.getNodeCount()); System.out.println("# edges: " + graph.getEdgeCount()); double averageDegree = 2.0 * graph.getEdgeCount() / graph.getNodeCount(); System.out.println("avg degree: " + averageDegree); int totalPossibleEdges = graph.getNodeCount() * (graph.getNodeCount() - 1) / 2; double density = graph.getEdgeCount() / (double) totalPossibleEdges; System.out.println("density: " + density); System.out.println("degree counts:"); for (int key : degreeCounts.keySet()) { System.out.println(key + "\t" + degreeCounts.get(key)); } System.out.println("longest path length counts:"); for (int key : longestPathLengthCounts.keySet()) { System.out.println(key + "\t" + longestPathLengthCounts.get(key)); } }
/** * This helper calculates all the attractive forces onto a node. Attractive forces from from the * edges pulling nodes towards each other, this will love through the edges of this node. * * @param current Node to calculate forces for. */ private void calculateNodeAttractiveForce(Node current) { // get all the edges of the current node ArrayList<Edge> nodeEdgeList = current.getEdgeList(); // of each of this node's edge do attactive forces Iterator<Edge> nodeEdges = nodeEdgeList.iterator(); /// int numOfEdgesWeight = 10 * (int) Math.round(nodeEdgeList.size() + SPACING); // Loop through edges and find edges containing current node while (nodeEdges.hasNext()) { Edge e = nodeEdges.next(); double edgeStrength = e.getStrength(); Node n; int dx, dy; double sign = 1.0; if (current == e.getNode1()) { n = e.getNode2(); dx = current.getX() - n.getX(); dy = current.getY() - n.getY(); } else { n = e.getNode1(); dx = current.getX() - n.getX(); dy = current.getY() - n.getY(); sign = -1.0; } double distance = Math.sqrt(dx * dx + dy * dy) + .1; // multiply by the strength of edge // current.setVX(current.getVX() - dx / numOfEdgesWeight * edgeStrength); // current.setVY(current.getVY() - dy / numOfEdgesWeight * edgeStrength); current.accelx += sign * (dx * STIFFNESS * (SPRING_LENGTH - distance)) / current.weight; current.accely += sign * (dy * STIFFNESS * (SPRING_LENGTH - distance)) / current.weight; // current.accelx += sign * (dx * (e.getStrength() + 1) * (SPRING_LENGTH - distance) * 0.5) / // current.weight; // current.accely += sign * (dy * (e.getStrength() + 1) * (SPRING_LENGTH - distance) * 0.5) / // current.weight; // n.accelx += sign * (dx * (e.getStrength() + 1) * (SPRING_LENGTH - distance) * 0.5) / // n.weight; // n.accely += sign * (dy * (e.getStrength() + 1) * (SPRING_LENGTH - distance) * 0.5) / // n.weight; } }