The Eco Lab graph library is a library providing a simple and lightweight structure for representing graphs (aka networks). A graph consists of a set of nodes labelled , and a set of edges , which have an optional weight factor attached.
struct Edge: public std::pair<unsigned,unsigned> { unsigned source(); unsigned target(); float weight; };
The abstract Graph interface has the following definition:
struct Graph { struct const_iterator { Edge operator*() const; const Edge* operator->() const; const_iterator& operator++(); bool operator==(const const_iterator& x) const; bool operator!=(const const_iterator& x) const; }; virtual const_iterator begin() const; virtual const_iterator end() const; virtual unsigned nodes() const; virtual unsigned links() const; virtual void push_back(const Edge& e); virtual bool contains(const Edge& e) const; virtual bool directed() const; virtual void clear(unsigned nodes=0); const Graph& operator=(const Graph& x); void input(const std::string& format, const std::string& filename); void output(const std::string& format, const std::string& filename) const; template <class BG> Graph_back_insert_iterator<Graph,BG> back_inserter(const BG& bg); }
The begin/end
methods allow one to iterate over the edges. Only a const_iterator
is supplied, as it is an error to change the value of an edge. One can
only reset a graph to the empty graph via clear, and construct the
graph incrementally using the push_back()
method.
The contains
method allows one to test whether a given edge is
in the graph, and directed
indicates whether the underlying graph
structure has directed edges or not. A bidirectional graph otherwise
appears as a directed graph where each edge appears twice, once for
each direction.
The input/output methods allow for the graph to be read/written from/to a file, in a variety of formats, given by the format parameter. Currently, the following formats are supported:
name | description |
pajek | Pajek's .net format |
lgl | LGL's .lgl format |
dot | Graphviz format |
gengraph | Gengraph |
models/netcomplexity_scripts
directory.
back_inserter
creates an output iterator suitable for use with
Boost Graph algorithms. As a simple example, to construct an Eco Lab
graph from a Boost Graph, do
std::pair<BG::edge_iterator,BG::edge_iterator> r=edges(bg); ConcreteGraph<DiGraph> g1; copy(r.first, r.second, g1.back_inserter(bg));
This interface can be used in both a dynamic polymorphism fashion (ie Graph is an abstract base class) and in a static polymorphism fashion.
The graph.h
header file provides two concrete graph types -
DiGraph and BiDirectionalGraph, which differ just in whether each edge
is directed or not.