10 template<
typename Token,
typename Value>
45 boost::adjacency_list<
48 boost::bidirectionalS,
52 using BoostVertex =
typename TokenGraphSavedBoostGraph::vertex_descriptor;
65 boost::remove_vertex(vertex,
m_graph);
89 auto from_it =
m_vertex.left.find(from);
93 auto edge_pair = boost::edge(from_it->second, to_it->second,
m_graph);
94 if (edge_pair.second) {
101 auto from_it =
m_vertex.left.find(from);
102 auto to_it =
m_vertex.left.find(to);
105 auto edge_pair = boost::edge(from_it->second, to_it->second,
m_graph);
106 if (edge_pair.second) {
116 auto from_it =
m_vertex.left.find(from);
117 auto to_it =
m_vertex.left.find(to);
120 auto edge_pair = boost::edge(from_it->second, to_it->second,
m_graph);
121 return edge_pair.second;
135 auto from_it =
m_vertex.left.find(from);
136 auto to_it =
m_vertex.left.find(to);
139 auto edge_pair = boost::edge(from_it->second, to_it->second,
m_graph);
140 if (edge_pair.second)
142 boost::remove_edge(edge_pair.first,
m_graph);
147 void addEdge(Token node, Token rhs,
bool isSuccessor)
178 template<
typename Visitor>
191 template<
typename VertexDescriptor,
typename Graph>
194 auto vertex_token_it =
graph->m_vertex.right.find(v);
195 if (vertex_token_it !=
graph->m_vertex.right.end()) {
196 Token token = vertex_token_it->second;
197 if (
graph->hasNode(token)) {
208 auto it =
m_vertex.left.find(token);
209 return m_graph[it->second] == 0;
243 template<
typename Visitor>
244 void visitBFS(Token startToken, Visitor visitor,
bool includeStart =
true)
const
246 auto start_vertex_it =
m_vertex.left.find(startToken);
247 if (start_vertex_it ==
m_vertex.left.end()) {
251 std::map<BoostVertex, boost::default_color_type> vertex_color_map;
252 auto color_pmap = boost::make_assoc_property_map(vertex_color_map);
256 boost::breadth_first_search(
m_graph, start_vertex_it->second,
257 boost::visitor(bfs_visitor).color_map(color_pmap));
267 for (
const auto& successor : info.
successors) {
273 std::vector<Token> predecessors,
274 std::vector<Token> successors)
276 NodeInfo info = { token, value, predecessors, successors };
281 for (
const auto& predecessor :
m_nodeMap[token].predecessors)
285 for (
const auto& successor :
m_nodeMap[token].successors)
297 std::deque<BoostVertex> sortedVertices;
299 std::map<BoostVertex, std::size_t> vertex_index_map;
300 std::size_t index = 0;
301 for (
auto [v_iter, v_end] = boost::vertices(
m_graph); v_iter != v_end; ++v_iter) {
302 vertex_index_map[*v_iter] = index++;
304 auto index_pmap = boost::make_assoc_property_map(vertex_index_map);
306 std::map<BoostVertex, boost::default_color_type> vertex_color_map;
307 auto color_pmap = boost::make_assoc_property_map(vertex_color_map);
309 boost::topological_sort(
m_graph, std::front_inserter(sortedVertices),
310 boost::vertex_index_map(index_pmap).color_map(color_pmap));
314 for (
auto vertex : sortedVertices) {
315 auto it =
m_vertex.right.find(vertex);
317 Token token = it->second;
332 m_nodeInfo = m_graph.m_nodeMap[token];
364 other.m_modified =
false;
403 if (std::find(preds.begin(), preds.end(), pred) == preds.end()) {
404 preds.push_back(pred);
413 auto it = std::find(preds.begin(), preds.end(), pred);
414 if (it != preds.end()) {
424 if (std::find(succs.begin(), succs.end(), succ) == succs.end()) {
425 succs.push_back(succ);
434 auto it = std::find(succs.begin(), succs.end(), succ);
435 if (it != succs.end()) {
462 std::vector<Value>
computeOrder(std::function<
bool(
const Value&)> canVisit)
464 std::deque<BoostVertex> sortedVertices;
466 std::map<BoostVertex, std::size_t> vertex_index_map;
467 std::size_t index = 0;
468 for (
auto [v_iter, v_end] = boost::vertices(
m_graph); v_iter != v_end; ++v_iter) {
469 vertex_index_map[*v_iter] = index++;
471 auto index_pmap = boost::make_assoc_property_map(vertex_index_map);
473 std::map<BoostVertex, boost::default_color_type> vertex_color_map;
474 auto color_pmap = boost::make_assoc_property_map(vertex_color_map);
476 boost::topological_sort(
m_graph, std::front_inserter(sortedVertices),
477 boost::vertex_index_map(index_pmap).color_map(color_pmap));
479 std::vector<Value> ret;
481 for (
auto vertex : sortedVertices) {
482 auto it =
m_vertex.right.find(vertex);
484 Token token = it->second;
497 template<
typename Visitor>
509 template<
typename VertexDescriptor,
typename Graph>
512 auto vertex_token_it =
graph->m_vertex.right.find(v);
513 if (vertex_token_it !=
graph->m_vertex.right.end()) {
514 Token token = vertex_token_it->second;
522 template<
typename Visitor>
525 std::vector<BoostVertex> rootVertices;
527 for (
auto [v_iter, v_end] = boost::vertices(
m_graph); v_iter != v_end; ++v_iter) {
528 if (boost::in_degree(*v_iter,
m_graph) == 0) {
529 auto vertex_token_it =
m_vertex.right.find(*v_iter);
530 if (vertex_token_it !=
m_vertex.right.end() &&
hasNode(vertex_token_it->second)) {
531 rootVertices.push_back(*v_iter);
536 std::map<BoostVertex, boost::default_color_type> vertex_color_map;
537 auto color_pmap = boost::make_assoc_property_map(vertex_color_map);
542 boost::depth_first_visit(
m_graph, root,
543 boost::visitor(dfs_visitor).color_map(color_pmap));
548 std::vector<Token> activePredecessors;
550 auto token_it =
m_vertex.left.find(token);
551 if (token_it ==
m_vertex.left.end()) {
552 return activePredecessors;
557 auto [in_edge_iter, in_edge_end] = boost::in_edges(vertex,
m_graph);
558 for (
auto edge_iter = in_edge_iter; edge_iter != in_edge_end; ++edge_iter) {
561 auto vertex_token_it =
m_vertex.right.find(source_vertex);
562 if (vertex_token_it !=
m_vertex.right.end()) {
563 Token predecessor_token = vertex_token_it->second;
565 if (
hasNode(predecessor_token)) {
566 activePredecessors.push_back(predecessor_token);
569 activePredecessors.insert(activePredecessors.end(), subPredecessors.begin(), subPredecessors.end());
574 return activePredecessors;
578 std::vector<Token> activeSuccessors;
580 auto token_it =
m_vertex.left.find(token);
581 if (token_it ==
m_vertex.left.end()) {
582 return activeSuccessors;
587 auto [out_edge_iter, out_edge_end] = boost::out_edges(vertex,
m_graph);
588 for (
auto edge_iter = out_edge_iter; edge_iter != out_edge_end; ++edge_iter) {
591 auto vertex_token_it =
m_vertex.right.find(target_vertex);
592 if (vertex_token_it !=
m_vertex.right.end()) {
593 Token successor_token = vertex_token_it->second;
595 if (
hasNode(successor_token)) {
596 activeSuccessors.push_back(successor_token);
599 activeSuccessors.insert(activeSuccessors.end(), subSuccessors.begin(), subSuccessors.end());
604 return activeSuccessors;
609 boost::bimaps::unordered_set_of<Token>,
NodeProbe(TokenGraph &graph, Token token)
NodeProbe & operator=(const NodeInfo &info)
NodeProbe(const NodeProbe &)=delete
NodeProbe & addSuccessor(const Token &succ)
NodeProbe & addPredecessor(const Token &pred)
NodeProbe & operator=(const NodeProbe &)=delete
const NodeInfo & operator*() const
const NodeInfo * operator->() const
NodeProbe(NodeProbe &&other) noexcept
const Token & token() const
NodeProbe & removePredecessor(const Token &pred)
NodeProbe & removeSuccessor(const Token &succ)
void discover_vertex(VertexDescriptor v, const Graph &g) const
TokenGraphBFSVisitor(const TokenGraph *g, Visitor v, Token start, bool include)
TokenGraphDFSVisitor(const TokenGraph *g, Visitor v)
void discover_vertex(VertexDescriptor v, const Graph &g) const
std::set< Token > visitedTokens
void addBoostEdge(Token from, Token to)
void addVertex(Token token, int weak_ref=0)
bool hasEdge(Token from, Token to) const
bool hasVertex(Token token) const
void addWeakRef(Token token)
typename TokenGraphSavedBoostGraph::vertex_descriptor BoostVertex
bool isZeroRefVertex(Token token) const
std::vector< Value > m_order
void visitDFSFromRoots(Visitor visitor) const
TokenGraphSavedBoostGraph m_graph
std::unordered_map< Token, NodeInfo > m_nodeMap
NodeProbe operator[](Token token)
void removeEdge(Token node, Token rhs, bool isSuccessor)
std::vector< Token > getActivePredecessors(const Token &token) const
void removeWeakRef(Token token)
void removeWeakRef(Token from, Token to)
std::vector< Value > computeOrder(std::function< bool(const Value &)> canVisit)
void removeNode(const Token &token)
void visitBFS(Token startToken, Visitor visitor, bool includeStart=true) const
void addWeakRef(Token from, Token to)
void addNode(Token token, Value value, std::vector< Token > predecessors, std::vector< Token > successors)
std::vector< Value > order() const
void removeBoostEdge(Token from, Token to)
boost::bimap< boost::bimaps::unordered_set_of< Token >, BoostVertex > m_vertex
boost::adjacency_list< boost::listS, boost::listS, boost::bidirectionalS, int, int > TokenGraphSavedBoostGraph
void addEdge(Token node, Token rhs, bool isSuccessor)
std::vector< Token > getActiveSuccessors(const Token &token) const
bool hasNode(Token token) const
void removeVertex(Token token)
void addNode(NodeInfo info)
void updateNode(const NodeInfo &info)
NodeInfo(Token token, Value value, std::vector< Token > predecessors, std::vector< Token > successors)
NodeInfo(Value value, std::vector< Token > predecessors, std::vector< Token > successors)
std::vector< Token > successors
std::vector< Token > predecessors