$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: asutton_at_[hidden]
Date: 2008-06-19 10:26:56
Author: asutton
Date: 2008-06-19 10:26:55 EDT (Thu, 19 Jun 2008)
New Revision: 46509
URL: http://svn.boost.org/trac/boost/changeset/46509
Log:
Initial support for directed graphs. Can now add vertices, edges. Implemented
degree functions.
Added:
   sandbox/SOC/2008/graphs/trunk/boost/graphs/out_descriptor.hpp   (contents, props changed)
Text files modified: 
   sandbox/SOC/2008/graphs/trunk/boost/graphs/directed_edge.hpp     |    61 ++++++                                  
   sandbox/SOC/2008/graphs/trunk/boost/graphs/directed_graph.hpp    |   340 +++++++++++++++++++++++++++++++++++++-- 
   sandbox/SOC/2008/graphs/trunk/boost/graphs/directed_vertex.hpp   |   103 ++++++++++-                             
   sandbox/SOC/2008/graphs/trunk/boost/graphs/edge_vector.hpp       |     9                                         
   sandbox/SOC/2008/graphs/trunk/boost/graphs/in_vector.hpp         |    43 ++++                                    
   sandbox/SOC/2008/graphs/trunk/boost/graphs/incidence_vector.hpp  |    80 +--------                               
   sandbox/SOC/2008/graphs/trunk/boost/graphs/out_vector.hpp        |    78 ++++++++                                
   sandbox/SOC/2008/graphs/trunk/boost/graphs/undirected_graph.hpp  |    45 +---                                    
   sandbox/SOC/2008/graphs/trunk/boost/graphs/undirected_vertex.hpp |     5                                         
   sandbox/SOC/2008/graphs/trunk/boost/graphs/vertex_vector.hpp     |     7                                         
   10 files changed, 617 insertions(+), 154 deletions(-)
Modified: sandbox/SOC/2008/graphs/trunk/boost/graphs/directed_edge.hpp
==============================================================================
--- sandbox/SOC/2008/graphs/trunk/boost/graphs/directed_edge.hpp	(original)
+++ sandbox/SOC/2008/graphs/trunk/boost/graphs/directed_edge.hpp	2008-06-19 10:26:55 EDT (Thu, 19 Jun 2008)
@@ -2,15 +2,68 @@
 #ifndef DIRECTED_EDGE_HPP
 #define DIRECTED_EDGE_HPP
 
-#include "ordered_pair.hpp"
-
 /**
- * A directed edge represents and edge within directed.
+ * A directed edge represents an edge in a directed graph. A directed edge is
+ * uniquely identified by its source and target verties and edge property.
+ *
+ * @param VertexDesc A vertex descriptor
+ * @param OutDesc An out edge descriptor.
  */
-template <typename SourceDesc, typename TargetDesc>
+template <typename VertexDesc, typename OutDesc>
 class directed_edge
 {
 public:
+    typedef VertexDesc vertex_descriptor;
+    typedef OutDesc out_descriptor;
+    typedef typename out_descriptor::edge_properties edge_properties;
+
+    /** @name Constructors */
+    //@{
+    inline directed_edge()
+        : _src()
+        , _out()
+    { }
+
+    inline directed_edge(vertex_descriptor v, OutDesc o)
+        : _src(v)
+        , _out(o)
+    { }
+    //@}
+
+    /** Return the source of the edge. */
+    inline vertex_descriptor source() const
+    { return _src; }
+
+    /** Return the target of the edge. */
+    inline vertex_descriptor target() const
+    { return _out.target(); }
+
+    /** @name Property Accessors
+     * Return the properties associated with the edge.
+     */
+    //@{
+    inline edge_properties& properties()
+    { return _out.properties(); }
+
+    inline edge_properties const& properties() const
+    { return _out.properties(); }
+    //@}
+
+    /** @name Operators */
+    //@{
+    inline bool operator==(directed_edge const& x)
+    { return _src == x._src && _out = x._out; }
+
+    inline bool operator!=(directed_edge const& x)
+    { return !operator==(x); }
+
+    inline bool operator<(directed_edge const& x)
+    { return std::make_pair(_src, _out) < std::make_pair(x._src, x._out); }
+    //@}
+
+private:
+    VertexDesc  _src;
+    OutDesc     _out;
 };
 
 
Modified: sandbox/SOC/2008/graphs/trunk/boost/graphs/directed_graph.hpp
==============================================================================
--- sandbox/SOC/2008/graphs/trunk/boost/graphs/directed_graph.hpp	(original)
+++ sandbox/SOC/2008/graphs/trunk/boost/graphs/directed_graph.hpp	2008-06-19 10:26:55 EDT (Thu, 19 Jun 2008)
@@ -2,7 +2,9 @@
 #ifndef DIRECTED_GRAPH_HPP
 #define DIRECTED_GRAPH_HPP
 
-// Notes on directed graphs... Unlike undirected graphs, which are required
+#include <boost/static_assert.hpp>
+
+// Notes on directed graphs... Unlike directed graphs, which are required
 // to globally store edge properties, the vertices directed graphs act as
 // the stores for nested properties. Edge properties are stored with the
 // out edges of each vertex.
@@ -37,44 +39,58 @@
 public:
     typedef VertexProps vertex_properties;
     typedef EdgeProps edge_properties;
-    
+
     // In order to create the vertex store, we have to create the vertex type.
     // In order to create the vertex type we need to create the edge store
     // types. There are two types of edge store types - one that stores outgoing
     // edges (a pair of vertex and edge property) and another that stores the
     // descriptors of incoming vertices.
-    
+
     // We have to generate the vertex descriptor before we can do anything else.
     typedef typename VertexStore::descriptor_type vertex_descriptor;
-    
-    // Use the vertex descriptor and edge properties to generate the out edge
-    // store for the graph.
+
+    // Use the vertex descriptor and edge properties to generate the out and in
+    // edge stores for the graph. Get the out edge descriptor type from the out
+    // store.
     typedef typename EdgeStore::template out_store<vertex_descriptor, edge_properties>::type out_edge_store;
-    
-    // Like above, but generate the in edge store.
-    typedef typename EdgeStore::template in_store<vertex_descriptor, edge_properties>::type in_edge_store;
-    
+    typedef typename out_edge_store::out_descriptor out_descriptor;
+    typedef typename EdgeStore::template in_store<vertex_descriptor, out_descriptor>::type in_edge_store;
+
+    // We can now generate the edge descriptor.
+    typedef directed_edge<vertex_descriptor, out_descriptor> edge_descriptor;
+
     // Generate the vertex type over the vertex properties, and in/out stores.
+    // We can also pull size
     // NOTE: Omitting the in-edge store allows us to create half-directed
     // graphs.
     typedef directed_vertex<vertex_properties, out_edge_store, in_edge_store> vertex_type;
-    
+    typedef typename vertex_type::out_size_type out_edges_size_type;
+    typedef typename vertex_type::in_size_type in_edges_size_type;
+    typedef typename vertex_type::incident_size_type incident_edges_size_type;
+
     // Finally, use the vertex type to generate the vertex store. This is then
     // used to generate types iteration and size functions.
     typedef typename VertexStore::template store<vertex_type>::type vertex_store;
     typedef typename vertex_store::size_type vertices_size_type;
     typedef typename vertex_store::vertex_iterator vertex_iterator;
     typedef typename vertex_store::vertex_range vertex_range;
+
     // FIXME: This is a bit hacky, but without constrained members, we need a key
     // type to enable mapped vertices.
     typedef typename VertexStore::key_type vertex_key;
 
+
     // Constructors
     directed_graph();
 
-    /** @name Vertex Set
-     * These functions operate (mostly) on the vertices of the graph. These
-     * functions include the ability to add, disconnect, and remove vertices.
+    /** @name Add Vertex
+     * Add a vertex to the graph. Add operations are determined by the concepts
+     * modeled by the vertex set.
+     *
+     * UnlabeledVertices        add_vertex()
+     * LabeledVerteces          add_vertex(vertex_properties)
+     * LabeledUniqueVertices    add_vertex(vertex_properties)
+     * MappedUniqueVertices     add_vertex(vertex_key)
      */
     //@{
     vertex_descriptor add_vertex();
@@ -82,6 +98,93 @@
     vertex_descriptor add_vertex(vertex_key const&, vertex_properties const&);
     //@}
 
+    /** @name Find Vertex
+     * Find a vertex in the graph. These methods only exist for graphs that
+     * have UniqueVertices. These functions can also be used to find the first
+     * vertex of a non-unique vertices.
+     *
+     * LabeledUniqueVertices    find_vertex(vertex_properties)
+     * MappedUniqueVertices     find_vertex(vertex_key)
+     */
+    //@{
+    vertex_descriptor find_vertex(vertex_properties const&) const;
+    vertex_descriptor find_vertex(vertex_key const&) const;
+    //@{
+
+    /** @name Disconnect Vertex
+     * Disconnect a vertex from the graph by removing all of its incident edges.
+     * These functions only exist for graphs with ReducibleEdgeSets. Functions
+     * that take properties or keys are provided for convenience, but have
+     * additional dependencies and cost. These additonal functions are
+     * equivalent to disconnect_vertex(find_vertex(x)) where x is either a
+     * vertex_properties or vertex_key.
+     *
+     * ReducibleEdgeSet         disconnect_vertex(vertex_descriptor)
+     * LabeledUniqueVertices    disconnect_vertex(vertex_properties)
+     * MappedUniqueVertices     disconnect_vertex(vertex_key)
+     */
+    //@{
+    void disconnect_vertex(vertex_descriptor);
+    void disconnect_vertex(vertex_properties const&);
+    void disconnect_vertex(vertex_key const&);
+    //@}
+
+    /** @name Remove Vertex
+     * Remove a vertex from the graph. These functions only exist for graphs
+     * with ReducibleVertexSets. Functions that take properties or keys are
+     * provided for convenience, but have additional requirements and cost.
+     * These additional functions are equivalent to remove_vertex(find_vertex(x))
+     * where x is either a vertex_properties or vertex_key.
+     *
+     * ReducibleVertexSet       remove_vertex(vertex_descriptor)
+     * LabeledUniqueVertices    remove_vertex(vertex_properties)
+     * MappedUniqueVertices     remove_vertex(vertex_key)
+     */
+    //@{
+    void remove_vertex(vertex_descriptor);
+    void remove_vertex(vertex_properties const&);
+    void remove_vertex(vertex_key const&);
+    //@}
+
+    /** @name Vertex Key
+     * Return the key for the given vertex. This is only provided for graphs
+     * with MappedVertices (can be multimapped).
+     */
+    //@{
+    vertex_key const& key(vertex_descriptor) const;
+    //@{
+
+    /** @name Add Edge
+     * Add an edge, connecting two vertices, to the graph.
+     */
+    //@{
+    edge_descriptor add_edge(vertex_descriptor, vertex_descriptor);
+    edge_descriptor add_edge(vertex_properties const&, vertex_properties const&);
+    edge_descriptor add_edge(vertex_key const&, vertex_key const&);
+
+    edge_descriptor add_edge(vertex_descriptor, vertex_descriptor, edge_properties const&);
+    edge_descriptor add_edge(vertex_properties const&, vertex_properties const&, edge_properties const&);
+    edge_descriptor add_edge(vertex_key const&, vertex_key const&, edge_properties const&);
+    //@{
+
+    /** @name Degree
+     * Return the in/out or cumulative degree of the given vertex.
+     */
+    //@{
+    out_edges_size_type out_degree(vertex_descriptor v) const;
+    in_edges_size_type in_degree(vertex_descriptor v) const;
+    incident_edges_size_type degree(vertex_descriptor v) const;
+    //@}
+
+
+    /** @name Property Accessors
+     * Access the properties of the given vertex or edge.
+     */
+    //@{
+    vertex_properties& operator[](vertex_descriptor);
+    edge_properties& operator[](edge_descriptor);
+    //@{
+
 private:
     vertex_store _verts;
 };
@@ -95,20 +198,23 @@
 { }
 
 /**
- * Add a vertex to the graph with no or default graph properties. Return a
- * descriptor to the vertex being returned.
+ * Add a vertex to the graph with no or default graph properties, and return a
+ * descriptor to the vertex being returned. This function should not be used
+ * with graphs that have LabeledUniqueVertices since each addition will return
+ * the same default-propertied vertex.
  */
 template <BOOST_GRAPH_DG_PARAMS>
 typename directed_graph<VP,EP,VS,ES>::vertex_descriptor
 directed_graph<VP,EP,VS,ES>::add_vertex()
 {
+    // BOOST_STATIC_ASSERT(!LabeledUniqueVertices<this_type>);
     return _verts.add();
 }
 
 /**
  * Add a vertex to the graph with the given properties and return a descriptor
- * for that vertex. If the graph has labeled, unique vertices, and the given 
- * properties describe a vertex already in the graph, then a new vertex is not 
+ * for that vertex. If the graph has labeled, unique vertices, and the given
+ * properties describe a vertex already in the graph, then a new vertex is not
  * added and the descriptor for the existing vertex is returned.
  */
 template <BOOST_GRAPH_DG_PARAMS>
@@ -130,4 +236,202 @@
     return _verts.add(k, vp);
 }
 
+/**
+ * Find the vertex with the given properties, returning a descriptor to it.
+ */
+template <BOOST_GRAPH_DG_PARAMS>
+typename directed_graph<VP,EP,VS,ES>::vertex_descriptor
+directed_graph<VP,EP,VS,ES>::find_vertex(vertex_properties const& vp) const
+{
+    BOOST_STATIC_ASSERT(is_not_none<vertex_properties>::value);
+    return _verts.find(vp);
+}
+
+/**
+ * Find the vertex with the given properties, returning a descriptor to it.
+ */
+template <BOOST_GRAPH_DG_PARAMS>
+typename directed_graph<VP,EP,VS,ES>::vertex_descriptor
+directed_graph<VP,EP,VS,ES>::find_vertex(vertex_key const& k) const
+{
+    return _verts.find(k);
+}
+
+/**
+ * Disconnect the vertex from the graph. This removes all edges incident (both
+ * incoming and outgoing) to the vertex, but will not remove the vertex itself.
+ */
+template <BOOST_GRAPH_DG_PARAMS>
+void
+directed_graph<VP,EP,VS,ES>::disconnect_vertex(vertex_descriptor v)
+{
+    // TODO: Implement me!
+}
+
+/**
+ * Disconnect the vertex having the given properties from the graph.
+ */
+template <BOOST_GRAPH_DG_PARAMS>
+void
+directed_graph<VP,EP,VS,ES>::disconnect_vertex(vertex_properties const& vp)
+{
+    BOOST_STATIC_ASSERT(is_not_none<vertex_properties>::value);
+    disconnect_vertex(find_vertex(vp));
+}
+
+/**
+ * Disconnect the vertex having the given key from the graph.
+ */
+template <BOOST_GRAPH_DG_PARAMS>
+void
+directed_graph<VP,EP,VS,ES>::disconnect_vertex(vertex_key const& k)
+{
+    disconnect_vertex(find_vertex(k));
+}
+
+/**
+ * Remove the vertex from the graph. This will disconnect the vertex from the
+ * graph prior to remove.
+ */
+template <BOOST_GRAPH_DG_PARAMS>
+void
+directed_graph<VP,EP,VS,ES>::remove_vertex(vertex_descriptor v)
+{
+    disconnect_vertex(v);
+    _verts.remove(v);
+}
+
+/**
+ * Remove the vertex from the graph identified by the given properties.
+ */
+template <BOOST_GRAPH_DG_PARAMS>
+void
+directed_graph<VP,EP,VS,ES>::remove_vertex(vertex_properties const& vp)
+{
+    BOOST_STATIC_ASSERT(is_not_none<vertex_properties>::value);
+    disconnect_vertex(vp);
+    _verts.remove(vp);
+}
+
+/**
+ * Remove the vertex from the graph identified by the given key.
+ */
+template <BOOST_GRAPH_DG_PARAMS>
+void
+directed_graph<VP,EP,VS,ES>::remove_vertex(vertex_key const& k)
+{
+    disconnect_vertex(k);
+    _verts.remove(k);
+}
+
+/**
+ * Return the key associated with the given vertex. This function is only
+ * available for graphs with mapped vertices.
+ */
+template <BOOST_GRAPH_DG_PARAMS>
+typename directed_graph<VP,EP,VS,ES>::vertex_key const&
+directed_graph<VP,EP,VS,ES>::key(vertex_descriptor v) const
+{
+    return _verts.key(v);
+}
+
+/**
+ * Add an edge, connecting the two vertices to the graph with default or no
+ * properties. The edge is added to both the in and out edge stores of the
+ * target and source vertices respectively.
+ */
+template <BOOST_GRAPH_DG_PARAMS>
+typename directed_graph<VP,EP,VS,ES>::edge_descriptor
+directed_graph<VP,EP,VS,ES>::add_edge(vertex_descriptor u, vertex_descriptor v)
+{
+    return add_edge(u, v, edge_properties());
+}
+
+/**
+ * Add an edge, connecting the two vertices to the graph with the given
+ * properties. The edge is added to both the in and out edge stores of the
+ * target and source vertices respectively.
+ */
+template <BOOST_GRAPH_DG_PARAMS>
+typename directed_graph<VP,EP,VS,ES>::edge_descriptor
+directed_graph<VP,EP,VS,ES>::add_edge(vertex_descriptor u,
+                                      vertex_descriptor v,
+                                      edge_properties const& ep)
+{
+    vertex_type &src = _verts.vertex(u);
+    vertex_type &tgt = _verts.vertex(v);
+
+    // Do we add the edge or not?
+    std::pair<typename vertex_type::out_iterator, bool> ins = src.allow(v);
+    if(ins.second) {
+        // The addition is allowed... Was there already an edge there? If not,
+        // connect u to v (and vice-versa) with the given properties. Otherwise,
+        // just return the existing edge.
+        if(ins.first == src.end_out()) {
+            out_descriptor o = src.connect_to(v, ep);
+            tgt.connect_from(u, o);
+            return edge_descriptor(u, o);
+        }
+        else {
+            return edge_descriptor(u, *ins.first);
+        }
+    }
+    else {
+        // Can't add the edge? This is a flat refusal (as in a loop).
+    }
+
+    return edge_descriptor();
+}
+
+/**
+ * Return the out degree of the given vertex.
+ */
+template <BOOST_GRAPH_DG_PARAMS>
+typename directed_graph<VP,EP,VS,ES>::out_edges_size_type
+directed_graph<VP,EP,VS,ES>::out_degree(vertex_descriptor v) const
+{
+    return _verts.vertex(v).out_degree();
+}
+
+/**
+ * Return the in degree of the given vertex.
+ */
+template <BOOST_GRAPH_DG_PARAMS>
+typename directed_graph<VP,EP,VS,ES>::in_edges_size_type
+directed_graph<VP,EP,VS,ES>::in_degree(vertex_descriptor v) const
+{
+    return _verts.vertex(v).in_degree();
+}
+
+/**
+ * Return the degree of the given vertex. This is simply the sum of the in
+ * and out degree of the vertex.
+ */
+template <BOOST_GRAPH_DG_PARAMS>
+typename directed_graph<VP,EP,VS,ES>::incident_edges_size_type
+directed_graph<VP,EP,VS,ES>::degree(vertex_descriptor v) const
+{
+    return _verts.vertex(v).degree();
+}
+
+/**
+ * Return the properties for the given vertex.
+ */
+template <BOOST_GRAPH_DG_PARAMS>
+typename directed_graph<VP,EP,VS,ES>::vertex_properties&
+directed_graph<VP,EP,VS,ES>::operator[](vertex_descriptor v)
+{
+    return _verts.properties(v);
+}
+
+/**
+ * Return the properties for the given edge.
+ */
+template <BOOST_GRAPH_DG_PARAMS>
+typename directed_graph<VP,EP,VS,ES>::edge_properties&
+directed_graph<VP,EP,VS,ES>::operator[](edge_descriptor e)
+{
+    return e.properties();
+}
+
 #endif
Modified: sandbox/SOC/2008/graphs/trunk/boost/graphs/directed_vertex.hpp
==============================================================================
--- sandbox/SOC/2008/graphs/trunk/boost/graphs/directed_vertex.hpp	(original)
+++ sandbox/SOC/2008/graphs/trunk/boost/graphs/directed_vertex.hpp	2008-06-19 10:26:55 EDT (Thu, 19 Jun 2008)
@@ -16,17 +16,48 @@
     typedef VertexProps vertex_properties;
     typedef typename out_store::vertex_descriptor vertex_descriptor;
 
+    typedef typename OutStore::edge_properties edge_properties;
+    typedef typename OutStore::out_descriptor out_descriptor;
+
     typedef typename out_store::const_iterator out_iterator;
     typedef typename out_store::size_type out_size_type;
-    
+
     typedef typename in_store::const_iterator in_iterator;
     typedef typename in_store::size_type in_size_type;
 
-    inline directed_vertex();
-    inline directed_vertex(vertex_properties const& vp);
+    typedef out_size_type incident_size_type;
+
+
+    /** @name Constructors */
+    //@{
+    inline directed_vertex()
+        : _props()
+        , _out()
+        , _in()
+    { }
+
+    inline directed_vertex(vertex_properties const& vp)
+        : _props(vp)
+        , _out()
+        , _in()
+    { }
+    //@}
+
+
+    std::pair<out_iterator, bool> allow(vertex_descriptor) const;
+
+    out_descriptor connect_to(vertex_descriptor, edge_properties const&);
+    void connect_from(vertex_descriptor, out_descriptor);
+
+    /** @name Property Accessors */
+    //@{
+    inline vertex_properties& properties()
+    { return _props; }
+
+    inline vertex_properties const& properties() const
+    { return _props; }
+    //@}
 
-    inline vertex_properties& properties();
-    inline vertex_properties const& properties() const;
 
     /** @name Out Edges */
     //@{
@@ -35,30 +66,38 @@
 
     inline out_iterator end_out() const
     { return _out.end(); }
-
-    inline out_size_type out_degree() const
-    { return _out.size(); }
     //@}
-    
+
     /** @name In Edges */
     //@{
     inline in_iterator begin_in() const
     { return _in.begin(); }
-    
+
     inline in_iterator end_in() const
     { return _in.end(); }
-    
+    //@}
+
+
+    /** @name Degree */
+    //@{
+    inline out_size_type out_degree() const
+    { return _out.size(); }
+
     inline in_size_type in_degree() const
     { return _in.size(); }
+
+    inline incident_size_type degree() const
+    { return out_degree() + in_degree(); }
     //@}
-    
+
+
     /** @name Operators */
     //@{
     inline bool operator==(directed_vertex const& x) const
     { return _props == x._props; }
 
     inline bool operator!=(directed_vertex const& x) const
-    { return !this->operator==(x); }    
+    { return !this->operator==(x); }
 
     inline bool operator<(directed_vertex const& x) const
     { return _props < x._props; }
@@ -70,4 +109,42 @@
     in_store            _in;
 };
 
+/**
+ * Determine if the connection from this vertex to the other should be allwed.
+ * This depends in part upon the structure of the out out edge store and the
+ * policies used to configure the graph. This function returns a pair containing
+ * an iterator to an existing edge and a bool, determining if the edge should
+ * be added anyways.
+ */
+template <typename V, typename O, typename I>
+std::pair<typename directed_vertex<V,O,I>::out_iterator, bool>
+directed_vertex<V,O,I>::allow(vertex_descriptor v) const
+{
+    return _out.allow(v);
+}
+
+/**
+ * Connect this vertex to the vertex v with the given properties. Return an out
+ * edge descriptor for the new edge.
+ */
+template <typename V, typename O, typename I>
+typename directed_vertex<V,O,I>::out_descriptor
+directed_vertex<V,O,I>::connect_to(vertex_descriptor v, edge_properties const& ep)
+{
+    return _out.add(std::make_pair(v, ep));
+}
+
+/**
+ * Add a incoming edge from the vertex v with out edge descriptor o.
+ *
+ * Unfortunately, we can't combine this operation with connet_to() because we
+ * don't actually have a descriptor for this vertex.
+ */
+template <typename V, typename O, typename I>
+void
+directed_vertex<V,O,I>::connect_from(vertex_descriptor v, out_descriptor o)
+{
+    return _in.add(std::make_pair(v, o));
+}
+
 #endif
Modified: sandbox/SOC/2008/graphs/trunk/boost/graphs/edge_vector.hpp
==============================================================================
--- sandbox/SOC/2008/graphs/trunk/boost/graphs/edge_vector.hpp	(original)
+++ sandbox/SOC/2008/graphs/trunk/boost/graphs/edge_vector.hpp	2008-06-19 10:26:55 EDT (Thu, 19 Jun 2008)
@@ -67,13 +67,12 @@
     };
 
     // The in store metafunction generates the type of vector used to store
-    // incoming edges (actually just the referencing vertex) of directed graph.
-    // In edges are partially represented by the referencing vertex and a
-    // pointer to the properties.
-    template <typename VertexDesc, typename Props>
+    // incoming edges of directed graph. In edges are represented by the
+    // referencing vertex and an out edge descriptor.
+    template <typename VertexDesc, typename OutDesc>
     struct in_store
     {
-        typedef std::pair<VertexDesc, Props*> in_pair;
+        typedef std::pair<VertexDesc, OutDesc> in_pair;
         typedef SecondAlloc<in_pair> in_allocator;
         typedef in_vector<in_pair, in_allocator> type;
     };
Modified: sandbox/SOC/2008/graphs/trunk/boost/graphs/in_vector.hpp
==============================================================================
--- sandbox/SOC/2008/graphs/trunk/boost/graphs/in_vector.hpp	(original)
+++ sandbox/SOC/2008/graphs/trunk/boost/graphs/in_vector.hpp	2008-06-19 10:26:55 EDT (Thu, 19 Jun 2008)
@@ -2,12 +2,49 @@
 #ifndef IN_VECTOR_HPP
 #define IN_VECTOR_HPP
 
-template <typename Edge, typename Allocator>
+#include <vector>
+
+/**
+ * The in-edge vector references incoming edges from other vertices. Each edge
+ * can be uniquely identified by its source vertex and property descriptor.
+ *
+ * @param Edge A pair describing a vertex descriptor and out edgedescriptor.
+ * @param Alloc The allocator for edge pairs.
+ */
+template <typename Edge, typename Alloc>
 class in_vector
 {
+    typedef std::vector<Edge, Alloc> store_type;
 public:
-    typedef none const_iterator;
-    typedef std::size_t size_type;
+    typedef Edge in_pair;
+    typedef typename Edge::first_type vertex_descriptor;
+    typedef typename Edge::second_type edge_descriptor;
+
+    typedef typename store_type::const_iterator const_iterator;
+    typedef typename store_type::size_type size_type;
+
+    in_vector()
+        : _edges()
+    { }
+
+    void add(in_pair);
+
+    /** Get the number of incoming edges (in degree). */
+    size_type size() const
+    { return _edges.size(); }
+
+private:
+    store_type _edges;
 };
 
+/**
+ * Add the given pair to the edge set.
+ */
+template <typename E, typename A>
+void
+in_vector<E,A>::add(in_pair e)
+{
+    _edges.push_back(e);
+}
+
 #endif
Modified: sandbox/SOC/2008/graphs/trunk/boost/graphs/incidence_vector.hpp
==============================================================================
--- sandbox/SOC/2008/graphs/trunk/boost/graphs/incidence_vector.hpp	(original)
+++ sandbox/SOC/2008/graphs/trunk/boost/graphs/incidence_vector.hpp	2008-06-19 10:26:55 EDT (Thu, 19 Jun 2008)
@@ -27,9 +27,12 @@
     typedef typename store_type::size_type size_type;
 
     // Constructors
-    incidence_vector();
+    inline incidence_vector()
+        : _edges()
+    { }
 
     std::pair<const_iterator, bool> allow(vertex_descriptor) const;
+
     void add(incidence_pair);
     iterator find(incidence_pair);
     const_iterator find(incidence_pair) const;
@@ -47,21 +50,6 @@
     store_type _edges;
 };
 
-#define BOOST_GRAPH_IV_PARAMS \
-    typename E, typename A
-
-template <BOOST_GRAPH_IV_PARAMS>
-incidence_vector<E,A>::incidence_vector()
-    : _edges()
-{ }
-
-template <BOOST_GRAPH_IV_PARAMS>
-void
-incidence_vector<E,A>::add(incidence_pair e)
-{
-    _edges.push_back(e);
-}
-
 /**
  * Incidence vectors always allow the addition of edges, assuming that no
  * policy conflicts exist. The first element of the return is the end() of the
@@ -69,7 +57,7 @@
  *
  * @complexity O(1)
  */
-template <BOOST_GRAPH_IV_PARAMS>
+template <typename E, typename A>
 std::pair<typename incidence_vector<E,A>::const_iterator, bool>
 incidence_vector<E,A>::allow(vertex_descriptor v) const
 {
@@ -77,60 +65,14 @@
     return make_pair(_edges.end(), true);
 }
 
-
-#undef BOOST_GRAPH_IV_PARAMS
-
-#if 0
-
-// Functions
-
-template <typename E>
-vertex_edge_vector<E>::vertex_edge_vector()
-    : base_type()
-{ }
-
-template <typename E>
-void
-vertex_edge_vector<E>::add(edge_descriptor e)
-{
-    this->_store.push_back(e);
-}
-
-template <typename E>
-typename vertex_edge_vector<E>::iterator
-vertex_edge_vector<E>::find(edge_descriptor e)
-{
-    return std::find(this->_store.begin(), this->_store.end(), e);
-}
-
-template <typename E>
-typename vertex_edge_vector<E>::const_iterator
-vertex_edge_vector<E>::find(edge_descriptor e) const
-{
-    return std::find(this->_store.begin(), this->_store.end(), e);
-}
-
-template <typename E>
-void
-vertex_edge_vector<E>::remove(edge_descriptor e)
-{
-    this->_store.erase(find(e));
-}
-
-template <typename E>
+/**
+ * Add the incidence pair to the vector.
+ */
+template <typename E, typename A>
 void
-vertex_edge_vector<E>::clear()
-{
-    this->_store.clear();
-}
-
-template <typename E>
-typename vertex_edge_vector<E>::size_type
-vertex_edge_vector<E>::size() const
+incidence_vector<E,A>::add(incidence_pair e)
 {
-    return this->_store.size();
+    _edges.push_back(e);
 }
 
 #endif
-
-#endif
Added: sandbox/SOC/2008/graphs/trunk/boost/graphs/out_descriptor.hpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2008/graphs/trunk/boost/graphs/out_descriptor.hpp	2008-06-19 10:26:55 EDT (Thu, 19 Jun 2008)
@@ -0,0 +1,53 @@
+
+#ifndef OUT_DESCRIPTOR_HPP
+#define OUT_DESCRIPTOR_HPP
+
+/**
+ * The out descriptor wraps an opaque reference to an out edge pair and
+ * provides some convenience functions for translating between the elements
+ * of the referenced pair and their "descriptors".
+ *
+ * @param OutPair The pair of vertex descriptor and edge property being
+ * described.
+ */
+template <typename OutPair>
+struct basic_out_descriptor
+{
+    typedef typename OutPair::first_type vertex_descriptor;
+    typedef typename OutPair::second_type edge_properties;
+
+    /** @name Constructors */
+    //@{
+    inline basic_out_descriptor()
+        : _d(0)
+    { }
+
+    inline basic_out_descriptor(basic_out_descriptor const& x)
+        : _d(x._d)
+    { }
+
+    inline basic_out_descriptor(OutPair& o)
+        : _d(&o)
+    { }
+
+    inline basic_out_descriptor(OutPair const& o)
+        : _d(&const_cast<OutPair&>(o))
+    { }
+    //@{
+
+    OutPair& pair() const
+    { return reinterpret_cast<OutPair*>(_d); }
+
+    vertex_descriptor target() const
+    { return pair().first; }
+
+    edge_properties& properties()
+    { return pair().second; }
+
+    edge_properties const& properties() const
+    { return pair().second; }
+
+    mutable void* _d;
+};
+
+#endif
Modified: sandbox/SOC/2008/graphs/trunk/boost/graphs/out_vector.hpp
==============================================================================
--- sandbox/SOC/2008/graphs/trunk/boost/graphs/out_vector.hpp	(original)
+++ sandbox/SOC/2008/graphs/trunk/boost/graphs/out_vector.hpp	2008-06-19 10:26:55 EDT (Thu, 19 Jun 2008)
@@ -4,14 +4,21 @@
 
 #include <vector>
 
+#include "out_descriptor.hpp"
+
 /**
  * The out vector implements vector-based, out-edge storage for directed graphs.
- * As an out-edge store, this type stores an edge property with the descriptor
- * referencing the adjacenct vertex. Vector-based stores support fast inserts, 
- * slow finds, and do not allow remove operations.
+ * out-edges are uniquely identified by their target vertex and property
+ * descriptor. As an out-edge store, this type stores an edge property with the
+ * target vertex descriptor. Vector-based stores support fast inserts, slow
+ * finds, and do not allow remove operations.
+ *
+ * The edge is required to be a pair containing a vertex descriptor and a edge
+ * property (not descriptor). This type defines the out_descriptor - an opaque
+ * reference to a target/property pair.
  *
- * Here, the edge is required to be a pair containing a vertex descriptor and a
- * edge property.
+ * @param Edge A pair describing a vertex descriptor and the edge properties.
+ * @param Alloc The allocator for edge pairs.
  */
 template <typename Edge, typename Alloc>
 class out_vector
@@ -21,16 +28,71 @@
     typedef Edge out_pair;
     typedef typename Edge::first_type vertex_descriptor;
     typedef typename Edge::second_type edge_properties;
-    
+
     typedef typename store_type::const_iterator const_iterator;
     typedef typename store_type::size_type size_type;
 
+    typedef basic_out_descriptor<out_pair> out_descriptor;
+
     inline out_vector()
-        : _store()
+        : _edges()
     { }
 
+    std::pair<const_iterator, bool> allow(vertex_descriptor v) const;
+    out_descriptor add(out_pair);
+
+    vertex_descriptor vertex(out_descriptor) const;
+
+    /** @name Iterators and Size */
+    //@{
+    inline const_iterator begin() const
+    { return _edges.begin(); }
+
+    inline const_iterator end() const
+    { return _edges.end(); }
+
+    /** Get the number of outgoing edges. */
+    inline size_type size() const
+    { return _edges.size(); }
+    //@{
+
 private:
-    store_type _store;
+    store_type _edges;
 };
 
+/**
+ * Out vectors always allow the insertion of new edges, unless configured by
+ * policy to do otherwise.
+ */
+template <typename E, typename A>
+std::pair<typename out_vector<E,A>::const_iterator, bool>
+out_vector<E,A>::allow(vertex_descriptor v) const
+{
+    return std::make_pair(_edges.end(), true);
+}
+
+/**
+ * Add the incident edge, returning the property descriptor of the added
+ * incidence pair.
+ */
+template <typename E, typename A>
+typename out_vector<E,A>::out_descriptor
+out_vector<E,A>::add(out_pair e)
+{
+    _edges.push_back(e);
+    return _edges.back();
+}
+
+/**
+ * Return the target vertex of the given edge property descriptor. Because each
+ * property descriptor references a unique edge, we can easily access the
+ * corresponding target vertex.
+ */
+template <typename E, typename A>
+typename out_vector<E,A>::vertex_descriptor
+out_vector<E,A>::vertex(out_descriptor p) const
+{
+    return p.target();
+}
+
 #endif
Modified: sandbox/SOC/2008/graphs/trunk/boost/graphs/undirected_graph.hpp
==============================================================================
--- sandbox/SOC/2008/graphs/trunk/boost/graphs/undirected_graph.hpp	(original)
+++ sandbox/SOC/2008/graphs/trunk/boost/graphs/undirected_graph.hpp	2008-06-19 10:26:55 EDT (Thu, 19 Jun 2008)
@@ -4,22 +4,6 @@
 
 #include "none.hpp"
 
-// Various issues...
-// * Undirected graphs have a global property store.
-// * Global property stores are lists (for node-based edge stores) and
-//   vectors (for vector edge stores).
-// * Edge descriptors are a triple: an unordered pair consisting of
-//   vertex descriptors, and an a property descriptor.
-// * The property descriptor provide access to the properties of the
-//   given edge. This would best be described as the edge property
-//   accessors.
-// * If there are no properties, then the property store doesn't really
-//   need to exist. We can just pretend to allocate them and return
-//   an integer "pseudo descriptor".
-
-// Note that the graph interface will fail to compile if a mapped graph is
-// requested whose key and property types are the same.
-
 #include "descriptor.hpp"
 
 #include "undirected_vertex.hpp"
@@ -233,13 +217,28 @@
     , _verts()
 { }
 
+/**
+ * Add a vertex to the graph with no or default properties, and return a
+ * descriptor to the vertex. Although supported for all adjacency lists, this
+ * function should not be used with graphs that have LabeledUniqueVertices
+ * as it will always return the same default-propertied vertex iterator.
+ */
 template <BOOST_GRAPH_UG_PARAMS>
 typename undirected_graph<VP,EP,VS,ES>::vertex_descriptor
 undirected_graph<VP,EP,VS,ES>::add_vertex()
 {
+    // BOOST_STATIC_ASSERT(!LabeledUniqueVertices<this_type>);
     return _verts.add();
 }
 
+/**
+ * Add a vertex to the graph with the given properties, and return a descriptor
+ * to the added vertes. If the graph has LabeledUniqe vertices, and a vertex
+ * with the given properties already exists in the graph, then a new vertex
+ * is not added and returned descriptor refers to the existing vertex.
+ *
+ * @requires LabeledVertices<Graph>
+ */
 template <BOOST_GRAPH_UG_PARAMS>
 typename undirected_graph<VP,EP,VS,ES>::vertex_descriptor
 undirected_graph<VP,EP,VS,ES>::add_vertex(vertex_properties const& vp)
@@ -251,7 +250,7 @@
  * Add a new vertex with the given properties to the graph and map it to the
  * given key.
  *
- * @requires VertexMap<Graph>
+ * @requires MappedUniqueVertices<Graph>
  */
 template <BOOST_GRAPH_UG_PARAMS>
 typename undirected_graph<VP,EP,VS,ES>::vertex_descriptor
@@ -262,8 +261,6 @@
 
 /**
  * Find the vertex with the given properties, returning a descriptor to it.
- *
- * @requires LabeledUniqueVertex<Graph> ???
  */
 template <BOOST_GRAPH_UG_PARAMS>
 typename undirected_graph<VP,EP,VS,ES>::vertex_descriptor
@@ -275,8 +272,6 @@
 
 /**
  * Find the vertex with the given properties, returning a descriptor to it.
- *
- * @requires MappedUniqueVertex<Graph>
  */
 template <BOOST_GRAPH_UG_PARAMS>
 typename undirected_graph<VP,EP,VS,ES>::vertex_descriptor
@@ -317,10 +312,6 @@
 
 /**
  * Disconnect the vertex having the given properties from the graph.
- *
- * @requires UniqueLabeledVertex<Graph>
- *
- * @todo What does this do for multiset vertex stores.
  */
 template <BOOST_GRAPH_UG_PARAMS>
 void
@@ -332,10 +323,6 @@
 
 /**
  * Disconnect the vertex having the given key from the graph.
- *
- * @requires UniqueMappedVertex<Graph>
- *
- * @todo What does this do for multimap vertex stores.
  */
 template <BOOST_GRAPH_UG_PARAMS>
 void
Modified: sandbox/SOC/2008/graphs/trunk/boost/graphs/undirected_vertex.hpp
==============================================================================
--- sandbox/SOC/2008/graphs/trunk/boost/graphs/undirected_vertex.hpp	(original)
+++ sandbox/SOC/2008/graphs/trunk/boost/graphs/undirected_vertex.hpp	2008-06-19 10:26:55 EDT (Thu, 19 Jun 2008)
@@ -4,7 +4,6 @@
 
 #include "incidence_iterator.hpp"
 
-
 /**
  * A vertex, at least for an undirected graph, is simply an repository
  * for the vertex' properties and an interface for the its incidence
@@ -58,12 +57,12 @@
 
     inline size_type degree() const
     { return _edges.size(); }
-    
+
     inline bool operator==(undirected_vertex const& x) const
     { return _props == x._props; }
 
     inline bool operator!=(undirected_vertex const& x) const
-    { return !this->operator==(x); }    
+    { return !this->operator==(x); }
 
     inline bool operator<(undirected_vertex const& x) const
     { return _props < x._props; }
Modified: sandbox/SOC/2008/graphs/trunk/boost/graphs/vertex_vector.hpp
==============================================================================
--- sandbox/SOC/2008/graphs/trunk/boost/graphs/vertex_vector.hpp	(original)
+++ sandbox/SOC/2008/graphs/trunk/boost/graphs/vertex_vector.hpp	2008-06-19 10:26:55 EDT (Thu, 19 Jun 2008)
@@ -31,11 +31,14 @@
     struct store
     {
         typedef Vertex stored_vertex;
-        typedef Alloc<stored_vertex> allocator_type;
-        typedef vertex_vector_impl<stored_vertex, allocator_type> type;
+        typedef Alloc<stored_vertex> allocator;
+        typedef vertex_vector_impl<stored_vertex, allocator> type;
     };
 };
 
+/**
+ * The default vertex vector uses the standard allocator.
+ */
 struct vertex_vector : basic_vertex_vector<std::allocator> { };