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.