Class MutableValueGraphAdapter<V,​W>

  • Type Parameters:
    V - the graph vertex type
    W - the value type
    All Implemented Interfaces:
    java.io.Serializable, java.lang.Cloneable, org.jgrapht.Graph<V,​com.google.common.graph.EndpointPair<V>>
    Direct Known Subclasses:
    MutableDoubleValueGraphAdapter

    public class MutableValueGraphAdapter<V,​W>
    extends BaseValueGraphAdapter<V,​W,​com.google.common.graph.MutableValueGraph<V,​W>>
    implements org.jgrapht.Graph<V,​com.google.common.graph.EndpointPair<V>>, java.lang.Cloneable, java.io.Serializable
    A graph adapter class using Guava's MutableValueGraph.

    The adapter uses class EndpointPair to represent edges. Changes in the adapter such as adding or removing vertices and edges are reflected in the underlying value graph.

    The class uses a converter from Guava's values to JGraphT's double weights. Thus, the resulting graph is weighted. Assume for example that the following class is the value type:

     class MyValue
         implements
         Serializable
     {
         private double value;
    
         public MyValue(double value)
         {
             this.value = value;
         }
    
         public double getValue()
         {
             return value;
         }
     }
     
    Then one could create an adapter using the following code:
     MutableValueGraph<String, MyValue> valueGraph =
         ValueGraphBuilder.directed().allowsSelfLoops(true).build();
     valueGraph.addNode("v1");
     valueGraph.addNode("v2");
     valueGraph.putEdgeValue("v1", "v2", new MyValue(5.0));
     
     Graph<String, EndpointPair<String>> graph = new MutableValueGraphAdapter<>(
         valueGraph, new MyValue(1.0), (ToDoubleFunction<MyValue> & Serializable) MyValue::getValue);
     
     double weight = graph.getEdgeWeight(EndpointPair.ordered("v1", "v2")); // should return 5.0
     

    This is a one-way conversion meaning that calling setEdgeWeight(EndpointPair, double) will throw an unsupported operation exception. Adjusting the weights can be done directly (by keeping an external reference) on the underlying MutableValueGraph and calling MutableValueGraph.putEdgeValue(Object, Object, Object). Changes on the values will be propagated upstream using the provided value converter.

    Author:
    Dimitrios Michail
    See Also:
    Serialized Form
    • Field Detail

      • defaultValue

        protected final W defaultValue
    • Constructor Detail

      • MutableValueGraphAdapter

        public MutableValueGraphAdapter​(com.google.common.graph.MutableValueGraph<V,​W> valueGraph,
                                        W defaultValue,
                                        java.util.function.ToDoubleFunction<W> valueConverter)
        Create a new adapter.
        Parameters:
        valueGraph - the value graph
        defaultValue - a default value to be used when creating new edges
        valueConverter - a function that converts a value to a double
      • MutableValueGraphAdapter

        public MutableValueGraphAdapter​(com.google.common.graph.MutableValueGraph<V,​W> valueGraph,
                                        W defaultValue,
                                        java.util.function.ToDoubleFunction<W> valueConverter,
                                        java.util.function.Supplier<V> vertexSupplier,
                                        java.util.function.Supplier<com.google.common.graph.EndpointPair<V>> edgeSupplier)
        Create a new adapter.
        Parameters:
        valueGraph - the value graph
        defaultValue - a default value to be used when creating new edges
        valueConverter - a function that converts a value to a double
        vertexSupplier - the vertex supplier
        edgeSupplier - the edge supplier
    • Method Detail

      • addEdge

        public com.google.common.graph.EndpointPair<V> addEdge​(V sourceVertex,
                                                               V targetVertex)
        Specified by:
        addEdge in interface org.jgrapht.Graph<V,​W>
      • addEdge

        public boolean addEdge​(V sourceVertex,
                               V targetVertex,
                               com.google.common.graph.EndpointPair<V> e)
        The provided edge object can either be null or must respect the source and target vertices that are provided as parameters.
        Specified by:
        addEdge in interface org.jgrapht.Graph<V,​W>
        Throws:
        java.lang.IllegalArgumentException - if edge e is not null and the sourceVertex parameter does not match the node U of the endpoint-pair
        java.lang.IllegalArgumentException - if edge e is not null and the targetVertex parameter does not match the node V of the endpoint-pair
      • addVertex

        public V addVertex()
        Specified by:
        addVertex in interface org.jgrapht.Graph<V,​W>
      • addVertex

        public boolean addVertex​(V v)
        Specified by:
        addVertex in interface org.jgrapht.Graph<V,​W>
      • removeEdge

        public com.google.common.graph.EndpointPair<V> removeEdge​(V sourceVertex,
                                                                  V targetVertex)
        Specified by:
        removeEdge in interface org.jgrapht.Graph<V,​W>
      • removeEdge

        public boolean removeEdge​(com.google.common.graph.EndpointPair<V> e)
        Specified by:
        removeEdge in interface org.jgrapht.Graph<V,​W>
      • removeVertex

        public boolean removeVertex​(V v)
        Specified by:
        removeVertex in interface org.jgrapht.Graph<V,​W>
      • setEdgeWeight

        public void setEdgeWeight​(com.google.common.graph.EndpointPair<V> e,
                                  double weight)
        This method always throws an UnsupportedOperationException since the adapter works one-way from values to weights. Adjusting the weights can be done by adjusting the values in the underlying ValueGraph which will automatically be propagated using the provided converter.
        Specified by:
        setEdgeWeight in interface org.jgrapht.Graph<V,​W>
        Parameters:
        e - edge on which to set weight
        weight - new weight for edge
        Throws:
        java.lang.UnsupportedOperationException - if the graph does not support weights
      • clone

        public java.lang.Object clone()
        Returns a shallow copy of this graph instance. Neither edges nor vertices are cloned.
        Overrides:
        clone in class java.lang.Object
        Returns:
        a shallow copy of this graph.
        Throws:
        java.lang.RuntimeException - in case the clone is not supported
        See Also:
        Object.clone()