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.