List of usage examples for com.google.common.graph MutableValueGraph putEdgeValue
@CanIgnoreReturnValue V putEdgeValue(N nodeU, N nodeV, V value);
From source file:io.acoia.graphs.MinimumSpanningTree.java
/** * An implementation of Kruskal's minimum spanning tree algorithm. * /*from w w w. j a v a 2 s .c o m*/ * Description from Wiki: Kruskal's algorithm is a minimum-spanning-tree algorithm which finds an * edge of the least possible weight that connects any two trees in the forest. It is a greedy * algorithm in graph theory as it finds a minimum spanning tree for a connected weighted graph * adding increasing cost arcs at each step. This means it finds a subset of the edges that forms * a tree that includes every vertex, where the total weight of all the edges in the tree is * minimized. If the graph is not connected, then it finds a minimum spanning forest (a minimum * spanning tree for each connected component). * * This implementation uses io.acoia.sets.UnionFind and expects a sorted list of edges, and thus * runs in O(E (V)) time. */ public static <E, N> ValueGraph<N, E> kruskals(ValueGraph<N, E> g, List<EndpointPair<N>> sortedEdges) { if (g.isDirected()) throw new IllegalArgumentException("Kruskal's does not support directed graphs"); // Set up a Graph to store the result. MutableValueGraph<N, E> tree = ValueGraphBuilder.undirected().allowsSelfLoops(false) .expectedNodeCount(g.nodes().size()).build(); for (N n : g.nodes()) { tree.addNode(n); } // Now we start kruskals.. most of the work is done by the UnionFind really... UnionFind<N> uf = new UnionFind<>(g.nodes()); for (EndpointPair<N> e : sortedEdges) { N nodeU = e.nodeU(); N nodeV = e.nodeV(); if (uf.findRoot(nodeU) != uf.findRoot(nodeV)) { tree.putEdgeValue(nodeU, nodeV, g.edgeValue(nodeU, nodeV)); uf.join(nodeU, nodeV); } } return tree; }
From source file:edu.uci.ics.jung.algorithms.transformation.NodePartitionCollapser.java
/** * Creates a new graph whose nodes correspond to the partitions of the supplied graph. Two nodes u * and v in the collapsed graph will be connected if there is an edge between any of the nodes in * u and any of the nodes in v, and u and v are distinct. The value of the edge represents the * number of such edges./*from ww w . j a v a 2 s. co m*/ * * @param partitioning a node partition of a graph * @return the collapsed graph */ public static <N> ValueGraph<Set<N>, Integer> collapseNodePartitions(NodePartition<N> partitioning) { Graph<N> original = partitioning.getGraph(); ValueGraphBuilder<Object, Object> builder = original.isDirected() ? ValueGraphBuilder.directed() : ValueGraphBuilder.undirected(); MutableValueGraph<Set<N>, Integer> collapsed = builder.build(); // create nodes in new graph corresponding to equivalence sets in the original graph for (Set<N> set : partitioning.getNodePartitions()) { collapsed.addNode(set); } // for each pair of endpoints in the original graph, connect the corresponding nodes // (representing partitions) in the collapsed graph if the partitions are different Map<N, Set<N>> nodeToPartition = partitioning.getNodeToPartitionMap(); for (EndpointPair<N> endpoints : original.edges()) { N nodeU = endpoints.nodeU(); N nodeV = endpoints.nodeV(); Set<N> partitionU = nodeToPartition.get(nodeU); Set<N> partitionV = nodeToPartition.get(nodeV); if (nodeU.equals(nodeV) || partitionU.equals(partitionV)) { // we only connect partitions if the partitions are different; // check the nodes first as an optimization continue; } int edgeCount = collapsed.edgeValueOrDefault(partitionU, partitionV, 0); collapsed.putEdgeValue(partitionU, partitionV, edgeCount + 1); } return collapsed; }
From source file:no.ssb.vtl.script.operations.hierarchy.HierarchyOperation.java
/** * Create the directed acyclic graph from the dataset. * <p>/* w ww . ja va 2 s . c om*/ * The dataset is required to have the following columns: * from, to, sign. * * @throws IllegalArgumentException if a circular dependency is found. * @throws IllegalArgumentException if from and to are not of the same type. */ private static ValueGraph<VTLObject, Composition> convertToHierarchy(final Dataset hierarchy) { // Checks. final DataStructure structure = checkNotNull(hierarchy).getDataStructure(); Component fromComponent = checkNotNull(structure.get(FROM_COLUMN_NAME), COLUMN_NOT_FOUND, FROM_COLUMN_NAME); Component toComponent = checkNotNull(structure.get(TO_COLUMN_NAME), COLUMN_NOT_FOUND, TO_COLUMN_NAME); Component signComponent = checkNotNull(structure.get(SIGN_COLUMN_NAME), COLUMN_NOT_FOUND, SIGN_COLUMN_NAME); // The graph. MutableValueGraph<VTLObject, Composition> graph = ValueGraphBuilder.directed().allowsSelfLoops(false) .build(); // Add all the points. try (Stream<DataPoint> stream = hierarchy.getData()) { for (DataPoint point : (Iterable<? extends DataPoint>) stream::iterator) { Map<Component, VTLObject> asMap = structure.asMap(point); VTLObject from = asMap.get(fromComponent); VTLObject to = asMap.get(toComponent); VTLObject sign = asMap.get(signComponent); Composition composition = checkNotNull(COMPOSITION_MAP.get(sign.get()), UNKNOWN_SIGN_VALUE, sign); List<List<VTLObject>> paths = findPaths(graph, to, from); checkArgument(paths.isEmpty(), CIRCULAR_DEPENDENCY, from, composition, to, paths); graph.putEdgeValue(from, to, composition); } return graph; } }
From source file:org.jgrapht.graph.guava.ImmutableValueGraphAdapter.java
@SuppressWarnings("unchecked") private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { ois.defaultReadObject();//from w ww .j a v a 2s . c om GraphType type = (GraphType) ois.readObject(); if (type.isMixed() || type.isAllowingMultipleEdges()) { throw new IOException("Graph type not supported"); } MutableValueGraph<V, W> mutableValueGraph = (type.isDirected() ? ValueGraphBuilder.directed() : ValueGraphBuilder.undirected()).allowsSelfLoops(type.isAllowingSelfLoops()).build(); // read vertices int n = ois.readInt(); for (int i = 0; i < n; i++) { V v = (V) ois.readObject(); mutableValueGraph.addNode(v); } // read edges int m = ois.readInt(); for (int i = 0; i < m; i++) { V s = (V) ois.readObject(); V t = (V) ois.readObject(); W w = (W) ois.readObject(); mutableValueGraph.putEdgeValue(s, t, w); } // setup the immutable copy this.valueGraph = ImmutableValueGraph.copyOf(mutableValueGraph); }