30 #pragma omit pack ecolab::Graph::back_insert_iterator 31 #pragma omit unpack ecolab::Graph::back_insert_iterator 32 #pragma omit pack ecolab::Graph::const_iterator 33 #pragma omit unpack ecolab::Graph::const_iterator 34 #pragma omit pack ecolab::BiDirectionalGraph::const_iterator 35 #pragma omit unpack ecolab::BiDirectionalGraph::const_iterator 36 #pragma omit pack ecolab::sparse_mat_graph_adaptor::const_iterator 37 #pragma omit unpack ecolab::sparse_mat_graph_adaptor::const_iterator 38 #pragma omit pack ecolab::sparse_mat_graph_adaptor 39 #pragma omit unpack ecolab::sparse_mat_graph_adaptor 45 struct Edge:
public std::pair<unsigned,unsigned>
47 typedef std::pair<unsigned,unsigned> super;
48 unsigned& source() {
return first;}
49 unsigned& target() {
return second;}
50 unsigned source()
const {
return first;}
51 unsigned target()
const {
return second;}
54 template<
class S,
class T>
55 Edge(S source, T target): super(source, target), weight(1.0) {
56 assert(source!=target);}
57 template<
class S,
class T,
class W>
58 Edge(S source, T target, W weight):
59 super(source, target), weight(weight) {
60 assert(source!=target);}
63 bool operator==(
const Edge& e)
const {
64 return first==e.first && second==e.second;
66 bool operator<(
const Edge& e)
const {
67 return first<e.first || (first==e.first && second<e.second);
73 template <
class Graph,
class BG>
75 public std::iterator<std::output_iterator_tag, void, void, void, void>
82 (
const typename BG::edge_iterator::value_type& bge)
97 typedef std::size_t size_type;
98 typedef std::ptrdiff_t difference_type;
104 virtual Edge operator*()
const=0;
112 public std::iterator<std::forward_iterator_tag,Edge>
120 Edge operator*()
const {
123 const Edge* operator->()
const {edge=*base();
return &edge;}
125 bool operator==(
const const_iterator& x)
const {
return base()==x.base();}
126 bool operator!=(
const const_iterator& x)
const {
return !operator==(x);}
134 virtual unsigned nodes()
const=0;
136 virtual unsigned links()
const=0;
138 virtual void push_back(
const Edge& e)=0;
140 template <
class BG>
void push_back
141 (
const typename BG::edge_iterator::value_type& e)
142 {push_back(
Edge(e.first,e.second));}
144 virtual bool contains(
const Edge& e)
const=0;
146 virtual bool directed()
const=0;
148 virtual void clear(
unsigned nodes=0)=0;
151 if (args.count) nodes=args;
162 void input(
const std::string& format,
const std::string& filename);
163 void output(
const std::string& format,
const std::string& filename)
const;
176 public G::const_iterator,
178 GraphAdaptor_const_iterator_base<G>, Graph::const_iterator_base
182 G::const_iterator(i) {}
183 Edge operator*()
const {
return G::const_iterator::operator*();}
185 G::const_iterator::operator++();
return *
this;}
187 return G::const_iterator::operator==(x);
192 return xp && operator==(*xp);
197 #pragma omit pack ecolab::Graph::const_iterator_base 198 #pragma omit unpack ecolab::Graph::const_iterator_base 199 #pragma omit pack ecolab::GraphAdaptor_const_iterator_base 200 #pragma omit unpack ecolab::GraphAdaptor_const_iterator_base 201 #pragma omit TCL_obj ecolab::GraphAdaptor_const_iterator_base 202 #pragma omit isa ecolab::GraphAdaptor_const_iterator_base 218 template <
class GG>
void Gpush(GG& g,
const Edge& e) {g.push_back(e);}
219 template <
class GG>
void Gpush(
const GG& g,
const Edge& e) {}
220 template <
class GG>
void Gclear(GG& g,
unsigned nodes) {g.clear(nodes);}
221 template <
class GG>
void Gclear(
const GG& g,
unsigned nodes) {}
229 r.
addObject<const_iterator_base>(g.begin());
234 r.
addObject<const_iterator_base>(g.end());
238 unsigned nodes()
const {
return g.nodes();}
239 unsigned links()
const {
return g.links();}
241 bool directed()
const;
243 void clear(
unsigned nodes=0) {Gclear(g,nodes);}
277 typedef std::set<Edge> Evec;
283 using Evec::value_type;
284 using Evec::size_type;
285 using Evec::difference_type;
287 using Evec::const_reference;
291 struct const_iterator:
public Evec::const_iterator
294 const_iterator(
const Evec::const_iterator& x): Evec::const_iterator(x) {}
295 bool operator==(
const const_iterator& x)
const {
return **
this==*x;}
298 using Evec::const_iterator;
301 typedef const_iterator iterator;
303 unsigned nodes()
const {
return num_nodes;}
304 unsigned links()
const {
return size();}
305 bool contains(
const Edge& e)
const {
return count(e);}
306 DiGraph(
unsigned nodes=0): num_nodes(nodes) {}
308 template <
class G>
DiGraph(
const G& g): num_nodes(0) {*
this=g;}
309 template <
class G>
const DiGraph& operator=(
const G& g) {
311 for (
typename G::const_iterator i=g.begin(); i!=g.end(); ++i) push_back(*i);
315 void push_back(
const Edge& e) {
316 if (e.source()>=num_nodes) num_nodes=e.source()+1;
317 if (e.target()>=num_nodes) num_nodes=e.target()+1;
320 void clear(
unsigned nodes=0) {num_nodes=nodes; Evec::clear();}
321 void swap(
DiGraph& g) {std::swap(num_nodes,g.num_nodes); Evec::swap(g);}
322 bool operator==(
const DiGraph& x)
const 323 {
return static_cast<const Evec&
>(*this)==
static_cast<const Evec&
>(x);}
324 bool operator!=(
const DiGraph& x)
const {
return !operator==(x);}
325 bool operator<(
const DiGraph& x)
const 326 {
return static_cast<const Evec&
>(*this)<
static_cast<const Evec&
>(x);}
330 #pragma omit pack ecolab::DiGraph::const_iterator 331 #pragma omit unpack ecolab::DiGraph::const_iterator 332 #pragma omit TCL_obj ecolab::DiGraph::const_iterator 333 #pragma omit isa ecolab::DiGraph::const_iterator 334 #pragma omit pack ecolab::BiDirectionalGraph_const_iterator 335 #pragma omit unpack ecolab::BiDirectionalGraph_const_iterator 336 #pragma omit TCL_obj ecolab::BiDirectionalGraph_const_iterator 337 #pragma omit isa ecolab::BiDirectionalGraph_const_iterator 341 public std::iterator<std::forward_iterator_tag,Edge>
344 DiGraph::const_iterator it;
346 mutable Edge swapped;
349 const Edge& operator*()
const {
350 if (first)
return *it;
353 swapped=
Edge(it->target(),it->source(), it->weight);
357 const Edge* operator->()
const {
return &operator*();}
360 {first=!first;
if (first) ++it;
return *
this;}
364 {first=!first;
if (!first) --it;
return *
this;}
368 {
return first==i.first && it==i.it;}
370 {
return !operator==(i);}
383 const_iterator begin()
const {
return const_iterator(graph.begin());}
384 const_iterator end()
const {
return const_iterator(graph.end());}
386 void push_back(
Edge e) {
387 if (e.source()>e.target()) std::swap(e.source(),e.target());
390 void clear(
unsigned nodes=0) {graph.clear(nodes);}
397 for (
typename G::const_iterator i=g.begin(); i!=g.end(); ++i) push_back(*i);
400 unsigned nodes()
const {
return graph.nodes();}
401 unsigned links()
const {
return 2*graph.links();}
402 bool contains(
Edge e)
const {
403 if (e.source()>e.target()) std::swap(e.source(),e.target());
404 return graph.contains(e);
423 std::map<std::pair<size_t, size_t>,
double > weights;
424 for (
size_t i=0; i<mat.row.
size(); ++i) {
426 weights[std::make_pair(mat.row[i],mat.col[i])]+=mat.val[i];
428 weights[std::make_pair(mat.col[i],mat.row[i])]-=mat.val[i];
430 std::map<std::pair<size_t, size_t>,
double >::iterator i = weights.begin();
431 for (; i!=weights.end(); ++i)
432 push_back(
Edge(i->first.first, i->first.second, i->second));
453 const Edge& operator*()
const 458 link=
Edge(mat.row[it], mat.col[it], std::abs(mat.val[it]));
461 const Edge* operator->()
const {
return &operator*();}
466 bool operator==(
const const_iterator& i)
const {
return it==i.it && &mat==&i.mat;}
467 bool operator!=(
const const_iterator& i)
const {
return !operator==(i);}
472 unsigned nodes()
const {assert(mat.rowsz==mat.colsz);
473 return mat.diag.
size()==0? mat.rowsz: mat.diag.
size();}
474 unsigned links()
const {
return(mat.row.
size());}
475 bool contains(
const Edge& e)
const {
476 for (
size_t i=0; i<mat.row.
size(); ++i)
477 if (mat.row[i]==e.source() && mat.col[i]==e.target())
489 Degrees(
unsigned nodes=0) : in_degree(nodes,0), out_degree(nodes,0) {}
496 for (
typename G::const_iterator e=g.begin(); e!=g.end(); ++e)
498 d.in_degree[e->target()]++;
499 d.out_degree[e->source()]++;
507 double rand() {
return 1;}
529 <
ecolab::GraphAdaptor_const_iterator_base<G> >:
533 <ecolab::GraphAdaptor_const_iterator_base<G> >:
540 std::ostream& operator<<(std::ostream& s,
const ecolab::Graph& x);
542 std::ostream& operator<<(std::ostream& s, const ecolab::ConcreteGraph<G>& x)
543 {
return s<<static_cast<const ecolab::Graph&>(x);}
545 inline std::ostream& operator<<(std::ostream& s,
const ecolab::DiGraph& x)
546 {
return s<<ecolab::GraphAdaptor<const ecolab::DiGraph>(x);}
547 inline std::ostream& operator<<(std::ostream& s,
549 {
return s<<ecolab::GraphAdaptor<const ecolab::BiDirectionalGraph>(x);}
562 #if defined(__GNUC__) && !defined(__ICC) && !defined(__clang__) 563 #pragma GCC diagnostic push 564 #pragma GCC diagnostic ignored "-Wunused-local-typedefs" 569 #if defined(__GNUC__) && !defined(__ICC) && !defined(__clang__) 570 #pragma GCC diagnostic pop descriptor access to a class's privates
sparse matrix class
Definition: sparse_mat.h:20
virtual const_iterator begin() const =0
iterator to first edge
virtual void push_back(const Edge &e)=0
add an edge. Node count is adjusted so that edge is valid.
bool contains(const Edge &e) const
true if graph contains e
Definition: graph.h:240
unsigned links() const
number of links
Definition: graph.h:239
iterator over edges
Definition: graph.h:111
Graph::const_iterator begin() const
iterator to first edge
Definition: graph.h:227
virtual unsigned nodes() const =0
number of nodes
unsigned nodes() const
number of nodes
Definition: graph.h:238
A graph in which each link is bidirectional.
Definition: graph.h:375
void ErdosRenyi_generate(Graph &g, unsigned nodes, unsigned links, urand &uni, random_gen &weight_dist=one)
random graph chosen uniformly from the set of graphs with n nodes and l links
DiGraph(const G &g)
initialise Graph using Graph "duck-typed" object
Definition: graph.h:308
void push_back(const Edge &e)
add an edge. Node count is adjusted so that edge is valid.
Definition: graph.h:242
abstract base class for representing random number generators
Definition: random.h:32
bool directed() const
true if a bidirectional graph (all edges go both ways)
Definition: graph.h:269
void clear(unsigned nodes=0)
remove all edges from the graph and set the node count
Definition: graph.h:243
class to allow access to private members
Definition: classdesc_access.h:21
helper for constructing null descriptors
Definition: classdesc.h:784
poly addObject()
Target object initialisation.
Definition: poly.h:68
class to allow access to private members
Definition: classdesc_access.h:22
#define CLASSDESC_ACCESS(type)
add friend statements for each accessor function
Definition: classdesc_access.h:36
void random_rewire(Graph &g, urand &u)
randomly rewire the graph g (in place), using random generator u
Graph_back_insert_iterator< Graph, BG > back_inserter(const BG &bg)
Definition: graph.h:169
Represent arguments to TCL commands.
Definition: TCL_obj_base.h:138
BiDirectionalGraph(const G &g)
initialise Graph using Graph "duck-typed" object
Definition: graph.h:394
void PreferentialAttach_generate(Graph &g, unsigned nodes, urand &uni, random_gen &indegree_dist=one, random_gen &weight_dist=one)
serialisation for standard containers
size_t size() const
number of elements
Definition: arrays.h:1766
_OPENMP
Definition: accessor.h:16
virtual const_iterator end() const =0
iterator beyond last edge
Contains access_* structs, and nothing else. These structs are used to gain access to private members...
Definition: accessor.h:55
Definition: random_basic.h:11
Graph::const_iterator end() const
iterator beyond last edge
Definition: graph.h:232