16namespace sequoia::maths
20 graph_flavour Flavour,
21 tree_link_direction TreeLinkDir,
25 class EdgeStorageConfig = bucketed_edge_storage_config,
26 class NodeWeightStorage = node_storage<NodeWeight>
28 requires ((TreeLinkDir == tree_link_direction::symmetric) || (Flavour == graph_flavour::directed))
51 using size_type =
typename base_type::size_type;
53 constexpr static tree_link_direction link_dir{TreeLinkDir};
65 template<
class... Args>
66 requires is_initializable_v<NodeWeight, Args...>
67 size_type add_node(
const size_type parent, Args&&... args)
72 template<
class... Args>
73 requires is_initializable_v<NodeWeight, Args...>
74 size_type insert_node(
const size_type pos,
const size_type parent, Args&&... args)
79 void prune(
const size_type node)
84 using base_type::swap_edges;
85 using base_type::sort_edges;
86 using base_type::stable_sort_edges;
87 using base_type::swap_nodes;
88 using base_type::sort_nodes;
97 while(std::ranges::distance(this->crbegin_edges(node), this->crend_edges(node)))
99 const auto target{this->crbegin_edges(node)->target_node()};
103 this->erase_node(node);
108 const std::ptrdiff_t offset{node == 0 ? 0 : 1};
110 while(std::ranges::distance(this->crbegin_edges(node), this->crend_edges(node)) > offset)
112 const auto target{this->crbegin_edges(node)->target_node()};
116 this->erase_node(node);
121 if(node >= this->order())
return;
123 std::vector<bool> toDelete(this->order(),
false);
124 toDelete[node] =
true;
126 for(size_type i{}; i < this->order(); ++i)
128 if(!toDelete[i]) prune(i, toDelete, btt);
131 for(size_type i{}; i < toDelete.size(); ++i)
134 const auto j{toDelete.size() - 1 - i};
135 if(toDelete[j]) this->erase_node(j);
141 if(
auto begin{this->cbegin_edges(node)}; begin != this->cend_edges(node))
143 const auto target{begin->target_node()};
146 toDelete[node] =
true;
150 prune(target, toDelete, btt);
151 if(toDelete[target]) toDelete[node] =
true;
159 tree_link_direction TreeLinkDir,
168 graph_flavour::directed,
179 graph_flavour::directed,
191 tree_link_direction TreeLinkDir,
198 requires (TreeLinkDir == tree_link_direction::symmetric)
202 graph_flavour::undirected,
213 graph_flavour::undirected,
227 using value_type = Tree;
229 using size_type =
typename Tree::size_type;
240 requires (!std::is_const_v<Tree>)
242 if(!m_pTree)
throw std::logic_error{
"Tree not found"};
248 const Tree& tree()
const
250 if(!m_pTree)
throw std::logic_error{
"Tree not found"};
256 size_type node()
const noexcept
262 bool empty()
const noexcept
264 return m_pTree ==
nullptr;
268 explicit operator bool()
const noexcept
270 return !empty() && (m_Node < m_pTree->order());
277 size_type m_Node{Tree::npos};
286 template<dynamic_tree T>
290 return adaptor.tree().cbegin_node_weights() + adaptor.node();
293 template<dynamic_tree T>
295 const auto& root_weight(
const basic_tree_adaptor<T>& adaptor)
297 return adaptor.tree().cbegin_node_weights()[adaptor.node()];
300 template<dynamic_tree T, std::invocable<
typename T::node_weight_type&> Fn>
301 void mutate_root_weight(basic_tree_adaptor<T>& adaptor, Fn fn)
303 adaptor.tree().mutate_node_weight(root_weight_iter(adaptor), fn);
306 template<std::input_or_output_iterator Iterator,
class TreeAdaptor>
310 using proxy = TreeAdaptor;
311 using value_type = proxy;
312 using reference = proxy;
313 using tree_reference_type =
typename TreeAdaptor::value_type&;
320 constexpr proxy get(Iterator i)
const
322 return {*m_pTree, i->target_node()};
335 using tree_pointer_type = std::remove_reference_t<tree_reference_type>*;
337 tree_pointer_type m_pTree{};
340 template<std::input_or_output_iterator Iterator,
class Adaptor>
344 template<std::input_or_output_iterator Iterator,
class TreeAdaptor>
348 using proxy = TreeAdaptor;
349 using value_type = proxy;
350 using reference = proxy;
356 constexpr static proxy get(Iterator i)
372 template<std::input_or_output_iterator Iterator,
class Adaptor>
Edge & Node storage traits, base class and final classes for dynamic graphs.
Definition: DynamicTree.hpp:225
Definition: DynamicTree.hpp:176
Definition: DynamicTree.hpp:346
Definition: DynamicTree.hpp:308
Definition: DynamicGraph.hpp:56
Definition: NodeStorage.hpp:272
Definition: DynamicTree.hpp:39
Definition: DynamicTree.hpp:210
An iterator with policies controlling dereferencing and auxiliary data.
Definition: Iterator.hpp:234
Definition: DynamicGraph.hpp:29
Definition: GraphPrimitive.hpp:84
Definition: GraphPrimitive.hpp:99