001/* 002 * Copyright (C) 2016 The Guava Authors 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017package com.google.common.graph; 018 019import com.google.common.annotations.Beta; 020import java.util.Set; 021import javax.annotation.Nullable; 022 023/** 024 * An interface for <a 025 * href="https://en.wikipedia.org/wiki/Graph_(discrete_mathematics)">graph</a>-structured data, 026 * whose edges have associated non-unique values. 027 * 028 * <p>A graph is composed of a set of nodes and a set of edges connecting pairs of nodes. 029 * 030 * <p>There are three primary interfaces provided to represent graphs. In order of increasing 031 * complexity they are: {@link Graph}, {@link ValueGraph}, and {@link Network}. You should generally 032 * prefer the simplest interface that satisfies your use case. See the <a 033 * href="https://github.com/google/guava/wiki/GraphsExplained#choosing-the-right-graph-type"> 034 * "Choosing the right graph type"</a> section of the Guava User Guide for more details. 035 * 036 * <h3>Capabilities</h3> 037 * 038 * <p>{@code ValueGraph} supports the following use cases (<a 039 * href="https://github.com/google/guava/wiki/GraphsExplained#definitions">definitions of 040 * terms</a>): 041 * 042 * <ul> 043 * <li>directed graphs 044 * <li>undirected graphs 045 * <li>graphs that do/don't allow self-loops 046 * <li>graphs whose nodes/edges are insertion-ordered, sorted, or unordered 047 * <li>graphs whose edges have associated values 048 * </ul> 049 * 050 * <p>{@code ValueGraph}, as a subtype of {@code Graph}, explicitly does not support parallel edges, 051 * and forbids implementations or extensions with parallel edges. If you need parallel edges, use 052 * {@link Network}. (You can use a positive {@code Integer} edge value as a loose representation of 053 * edge multiplicity, but the {@code *degree()} and mutation methods will not reflect your 054 * interpretation of the edge value as its multiplicity.) 055 * 056 * <h3>Building a {@code ValueGraph}</h3> 057 * 058 * <p>The implementation classes that {@code common.graph} provides are not public, by design. To 059 * create an instance of one of the built-in implementations of {@code ValueGraph}, use the 060 * {@link ValueGraphBuilder} class: 061 * 062 * <pre>{@code 063 * MutableValueGraph<Integer, Double> graph = ValueGraphBuilder.directed().build(); 064 * }</pre> 065 * 066 * <p>{@link ValueGraphBuilder#build()} returns an instance of {@link MutableValueGraph}, which is a 067 * subtype of {@code ValueGraph} that provides methods for adding and removing nodes and edges. If 068 * you do not need to mutate a graph (e.g. if you write a method than runs a read-only algorithm on 069 * the graph), you should use the non-mutating {@link ValueGraph} interface, or an {@link 070 * ImmutableValueGraph}. 071 * 072 * <p>You can create an immutable copy of an existing {@code ValueGraph} using {@link 073 * ImmutableValueGraph#copyOf(ValueGraph)}: 074 * 075 * <pre>{@code 076 * ImmutableValueGraph<Integer, Double> immutableGraph = ImmutableValueGraph.copyOf(graph); 077 * }</pre> 078 * 079 * <p>Instances of {@link ImmutableValueGraph} do not implement {@link MutableValueGraph} 080 * (obviously!) and are contractually guaranteed to be unmodifiable and thread-safe. 081 * 082 * <p>The Guava User Guide has <a 083 * href="https://github.com/google/guava/wiki/GraphsExplained#building-graph-instances">more 084 * information on (and examples of) building graphs</a>. 085 * 086 * <h3>Additional documentation</h3> 087 * 088 * <p>See the Guava User Guide for the {@code common.graph} package (<a 089 * href="https://github.com/google/guava/wiki/GraphsExplained">"Graphs Explained"</a>) for 090 * additional documentation, including: 091 * 092 * <ul> 093 * <li><a 094 * href="https://github.com/google/guava/wiki/GraphsExplained#equals-hashcode-and-graph-equivalence"> 095 * {@code equals()}, {@code hashCode()}, and graph equivalence</a> 096 * <li><a href="https://github.com/google/guava/wiki/GraphsExplained#synchronization"> 097 * Synchronization policy</a> 098 * <li><a href="https://github.com/google/guava/wiki/GraphsExplained#notes-for-implementors">Notes 099 * for implementors</a> 100 * </ul> 101 * 102 * @author James Sexton 103 * @author Joshua O'Madadhain 104 * @param <N> Node parameter type 105 * @param <V> Value parameter type 106 * @since 20.0 107 */ 108@Beta 109public interface ValueGraph<N, V> extends BaseGraph<N> { 110 // 111 // ValueGraph-level accessors 112 // 113 114 /** {@inheritDoc} */ 115 @Override 116 Set<N> nodes(); 117 118 /** {@inheritDoc} */ 119 @Override 120 Set<EndpointPair<N>> edges(); 121 122 /** 123 * Returns a live view of this graph as a {@link Graph}. The resulting {@link Graph} will have an 124 * edge connecting node A to node B if this {@link ValueGraph} has an edge connecting A to B. 125 */ 126 Graph<N> asGraph(); 127 128 // 129 // ValueGraph properties 130 // 131 132 /** {@inheritDoc} */ 133 @Override 134 boolean isDirected(); 135 136 /** {@inheritDoc} */ 137 @Override 138 boolean allowsSelfLoops(); 139 140 /** {@inheritDoc} */ 141 @Override 142 ElementOrder<N> nodeOrder(); 143 144 // 145 // Element-level accessors 146 // 147 148 /** {@inheritDoc} */ 149 @Override 150 Set<N> adjacentNodes(N node); 151 152 /** {@inheritDoc} */ 153 @Override 154 Set<N> predecessors(N node); 155 156 /** {@inheritDoc} */ 157 @Override 158 Set<N> successors(N node); 159 160 /** {@inheritDoc} */ 161 @Override 162 int degree(N node); 163 164 /** {@inheritDoc} */ 165 @Override 166 int inDegree(N node); 167 168 /** {@inheritDoc} */ 169 @Override 170 int outDegree(N node); 171 172 /** {@inheritDoc} */ 173 @Override 174 boolean hasEdgeConnecting(N nodeU, N nodeV); 175 176 /** 177 * Returns the value of the edge connecting {@code nodeU} to {@code nodeV}, if one is present; 178 * otherwise, returns {@code defaultValue}. 179 * 180 * <p>In an undirected graph, this is equal to {@code edgeValueOrDefault(nodeV, nodeU, 181 * defaultValue)}. 182 * 183 * @throws IllegalArgumentException if {@code nodeU} or {@code nodeV} is not an element of this 184 * graph 185 */ 186 @Nullable 187 V edgeValueOrDefault(N nodeU, N nodeV, @Nullable V defaultValue); 188 189 // 190 // ValueGraph identity 191 // 192 193 /** 194 * Returns {@code true} iff {@code object} is a {@link ValueGraph} that has the same elements and 195 * the same structural relationships as those in this graph. 196 * 197 * <p>Thus, two value graphs A and B are equal if <b>all</b> of the following are true: 198 * 199 * <ul> 200 * <li>A and B have equal {@link #isDirected() directedness}. 201 * <li>A and B have equal {@link #nodes() node sets}. 202 * <li>A and B have equal {@link #edges() edge sets}. 203 * <li>The {@link #edgeValue(Object, Object) value} of a given edge is the same in both A and B. 204 * </ul> 205 * 206 * <p>Graph properties besides {@link #isDirected() directedness} do <b>not</b> affect equality. 207 * For example, two graphs may be considered equal even if one allows self-loops and the other 208 * doesn't. Additionally, the order in which nodes or edges are added to the graph, and the order 209 * in which they are iterated over, are irrelevant. 210 * 211 * <p>A reference implementation of this is provided by {@link AbstractValueGraph#equals(Object)}. 212 */ 213 @Override 214 boolean equals(@Nullable Object object); 215 216 /** 217 * Returns the hash code for this graph. The hash code of a graph is defined as the hash code of a 218 * map from each of its {@link #edges() edges} to the associated {@link #edgeValue(Object, Object) 219 * edge value}. 220 * 221 * <p>A reference implementation of this is provided by {@link AbstractValueGraph#hashCode()}. 222 */ 223 @Override 224 int hashCode(); 225}