59 auto max_val = std::numeric_limits<size_t>::max();
63 #pragma omp parallel for
64 for(
size_t ni = 0; ni < tree.
node_count(); ++ni ) {
65 auto const& row_node = tree.
node_at( ni );
66 assert( row_node.index() == ni );
69 mat( row_node.index(), row_node.index() ) = 0;
76 for(
auto it :
levelorder( row_node.link() )) {
78 if (it.is_first_iteration()) {
79 assert( it.node().index() == row_node.index() );
85 assert( mat(row_node.index(), it.node().index()) == max_val );
86 assert( mat(row_node.index(), it.link().outer().node().index()) != max_val );
90 mat( row_node.index(), it.node().index() )
91 = 1 + mat(row_node.index(), it.link().outer().node().index());
103 throw std::runtime_error(
104 "Cannot caluclate node_path_length_vector, as the given Node does not belong to the Tree."
107 auto max_val = std::numeric_limits<size_t>::max();
110 std::vector<size_t> vec;
112 vec[ node.
index() ] = 0;
117 if (it.is_first_iteration()) {
123 assert( vec[it.node().index()] == max_val );
124 assert( vec[it.link().outer().node().index()] != max_val );
128 vec[it.node().index()] = 1 + vec[it.link().outer().node().index()];
155 #pragma omp parallel for
156 for(
size_t ei = 0; ei < tree.
edge_count(); ++ei ) {
157 auto const& row_edge = tree.
edge_at( ei );
158 assert( row_edge.index() == ei );
160 for(
auto const& col_edge : tree.
edges() ) {
163 if (row_edge.index() == col_edge.index()) {
164 mat(row_edge.index(), row_edge.index()) = 0;
169 auto pp = node_depth_mat(
170 row_edge.primary_node().index(),
171 col_edge.primary_node().index()
175 auto ps = node_depth_mat(
176 row_edge.primary_node().index(),
177 col_edge.secondary_node().index()
181 auto sp = node_depth_mat(
182 row_edge.secondary_node().index(),
183 col_edge.primary_node().index()
188 auto dist = std::min({ pp, ps, sp });
189 assert( dist <= node_depth_mat(
190 row_edge.secondary_node().index(),
191 col_edge.secondary_node().index()
195 mat( row_edge.index(), col_edge.index() ) = dist + 1;
207 throw std::runtime_error(
208 "Cannot caluclate node_path_length_vector, as the given Edge does not belong to the Tree."
212 auto max_val = std::numeric_limits<size_t>::max();
213 std::vector<size_t> vec( tree.
edge_count(), max_val );
219 for(
auto const& col_edge : tree.
edges() ) {
221 if( edge.
index() == col_edge.index() ) {
222 vec[ edge.
index() ] = 0;
227 auto pp = p_node_dist[ col_edge.primary_node().index() ];
230 auto ps = p_node_dist[ col_edge.secondary_node().index() ];
233 auto sp = s_node_dist[ col_edge.primary_node().index() ];
237 auto dist = std::min({ pp, ps, sp });
238 assert( dist <= s_node_dist[ col_edge.secondary_node().index() ] );
241 vec[ col_edge.index() ] = dist + 1;
255 std::vector< std::pair< TreeNode const*, size_t >> vec;
261 for(
auto const& node : tree.
nodes() ) {
264 assert(vec[ node.index() ].first ==
nullptr);
270 vec[ node.index() ].first = &it.node();
271 vec[ node.index() ].second = it.depth();