9#include <kernel/adjacency/base.hpp>
10#include <kernel/adjacency/adjactor.hpp>
32 typedef std::set<Index> IdxSet;
33 typedef std::vector<IdxSet> IdxSetVec;
68 Index num_nodes_domain,
69 Index num_nodes_image)
88 template<
typename Adjactor_>
91 const Adjactor_& adjactor)
103 _render_as_is(adjactor);
110 _render_transpose(adjactor);
134 const Adjactor1_& adjactor1,
135 const Adjactor2_& adjactor2)
147 _render_as_is(adjactor1, adjactor2);
154 _render_transpose(adjactor1, adjactor2);
176 _indices = std::move(other._indices);
178 other._num_nodes_domain = other._num_nodes_image =
Index(0);
286 return _indices[domain_node].find(image_node) !=
_indices[domain_node].end();
305 return _indices[domain_node].insert(image_node).second;
325 return _indices[domain_node].erase(image_node) > 0;
334 template<
typename Adjactor_>
339 typedef typename Adjactor_::ImageIterator AImIt;
342 std::vector<Index> img_idx;
354 for(; it != jt; ++it)
356 img_idx.push_back(*it);
364 for(
Index j(0); j < img_idx.size(); ++j)
367 AImIt it(adjactor.image_begin(img_idx[j]));
368 AImIt jt(adjactor.image_end(img_idx[j]));
369 for(; it != jt; ++it)
386 template<
typename Adjactor_>
387 void _render_as_is(
const Adjactor_& adj)
389 typedef typename Adjactor_::ImageIterator AImIt;
399 AImIt cur(adj.image_begin(i));
400 AImIt end(adj.image_end(i));
401 for(; cur != end; ++cur)
409 template<
typename Adjactor_>
410 void _render_transpose(
const Adjactor_& adj)
412 typedef typename Adjactor_::ImageIterator AImIt;
422 AImIt cur(adj.image_begin(i));
423 AImIt end(adj.image_end(i));
424 for(; cur != end; ++cur)
436 const Adjactor1_& adj1,
437 const Adjactor2_& adj2)
440 XASSERTM(adj1.get_num_nodes_image() == adj2.get_num_nodes_domain(),
"Adjactor dimension mismatch!");
442 typedef typename Adjactor1_::ImageIterator AImIt1;
443 typedef typename Adjactor2_::ImageIterator AImIt2;
453 AImIt1 cur1(adj1.image_begin(i));
454 AImIt1 end1(adj1.image_end(i));
455 for(; cur1 != end1; ++cur1)
457 AImIt2 cur2(adj2.image_begin(*cur1));
458 AImIt2 end2(adj2.image_end(*cur1));
459 for(; cur2 != end2; ++cur2)
470 void _render_transpose(
471 const Adjactor1_& adj1,
472 const Adjactor2_& adj2)
475 XASSERTM(adj1.get_num_nodes_image() == adj2.get_num_nodes_domain(),
"Adjactor dimension mismatch!");
477 typedef typename Adjactor1_::ImageIterator AImIt1;
478 typedef typename Adjactor2_::ImageIterator AImIt2;
488 AImIt1 cur1(adj1.image_begin(i));
489 AImIt1 end1(adj1.image_end(i));
490 for(; cur1 != end1; ++cur1)
492 AImIt2 cur2(adj2.image_begin(*cur1));
493 AImIt2 end2(adj2.image_end(*cur1));
494 for(; cur2 != end2; ++cur2)
523 return _indices[domain_node].begin();
#define ASSERTM(expr, msg)
Debug-Assertion macro definition with custom message.
#define XASSERTM(expr, msg)
Assertion macro definition with custom message.
Dynamic Adjacency Graph implementation.
Index degree(Index domain_node) const
Returns the degree of a domain node.
DynamicGraph(Index num_nodes_domain, Index num_nodes_image)
Constructor.
DynamicGraph(RenderType render_type, const Adjactor1_ &adjactor1, const Adjactor2_ &adjactor2)
Composite-Render constructor.
Index _num_nodes_image
total number of image nodes
DynamicGraph()
default constructor
void clear()
Clears the graph.
bool insert(Index domain_node, Index image_node)
Inserts a new adjacency entry to the graph.
bool exists(Index domain_node, Index image_node) const
Checks whether an adjacency entry exists.
bool erase(Index domain_node, Index image_node)
Erases an adjacency entry from the graph.
Index get_num_nodes_image() const
Returns the number of image nodes.
Index get_num_indices() const
Returns the total number of indices.
Index _num_nodes_domain
total number of domain nodes
ImageIterator image_begin(Index domain_node) const
Returns an iterator for the first adjacent image node.
virtual ~DynamicGraph()
virtual destructor
DynamicGraph(DynamicGraph &&other)
move ctor
void compose(const Adjactor_ &adjactor)
Composes this dynamic graph with another adjactor in-situ.
IdxSet::const_iterator ImageIterator
ImageIterator for Adjactor interface implementation.
DynamicGraph clone() const
Clones this dynamic graph.
DynamicGraph(RenderType render_type, const Adjactor_ &adjactor)
Render constructor.
DynamicGraph & operator=(DynamicGraph &&other)
move-assign operator
IdxSetVec _indices
index-set-vector
Index get_num_nodes_domain() const
Returns the number of domain nodes.
ImageIterator image_end(Index domain_node) const
Returns an iterator for the first position past the last adjacent image node.
Index degree() const
Returns the degree of the graph.
RenderType
Render type enumeration.
@ injectify_sorted
Render-Injectified mode, sort image indices.
@ transpose
Render-Transpose mode.
@ injectify_transpose
Render-Injectified-Transpose mode.
@ injectify_transpose_sorted
Render-Injectified-Transpose mode, sort image indices.
@ injectify
Render-Injectified mode.
@ transpose_sorted
Render-Transpose mode, sort image indices.
@ as_is
Render-As-Is mode.
@ as_is_sorted
Render-As-Is mode, sort image indices.
std::uint64_t Index
Index data type.