51#include <lal/linear_arrangement.hpp>
52#include <lal/numeric/rational.hpp>
53#include <lal/graphs/graph.hpp>
54#include <lal/utilities/aggregations.hpp>
87template <
class graph_t>
89(
const std::vector<graph_t>& L,
const std::vector<linear_arrangement>& P = {})
92 static_assert(std::is_base_of_v<graphs::graph, graph_t>);
97 assert(P.size() == 0 or L.size() == P.size());
102 typedef std::pair<uint64_t, uint64_t> DD_m;
106#define IDE linear_arrangement::identity(G.get_num_nodes())
107 return utilities::one_level_aggregation<ratio, true>
109 L.begin(), L.end(),
nullptr,
nullptr,
111 [](
const graph_t& G) { return DD_m{sum_edge_lengths(G, IDE), G.get_num_edges()}; },
113 [](uint64_t& total, uint64_t new_value) { total += new_value; },
115 [](uint64_t& total, uint64_t new_value) { total += new_value; },
117 [](uint64_t DDs, std::size_t) {
return DDs; },
119 [](uint64_t num_edges, std::size_t) {
return num_edges; },
121 [](uint64_t DDs, uint64_t sum_num_edges) {
return ratio(DDs, sum_num_edges); }
127 return utilities::one_level_aggregation<ratio, false>
129 L.begin(), L.end(), P.begin(), P.end(),
131 [](
const graph_t& G,
const ARR& arr) { return DD_m(sum_edge_lengths(G, arr), G.get_num_edges()); },
133 [](uint64_t& total, uint64_t new_value) { total += new_value; },
135 [](uint64_t& total, uint64_t new_value) { total += new_value; },
137 [](uint64_t DDs, std::size_t) { return DDs; },
139 [](uint64_t num_edges, std::size_t) { return num_edges; },
141 [](uint64_t DDs, uint64_t sum_num_edges) { return ratio(DDs, sum_num_edges); }
161template <
class graph_t>
163(
const std::vector<graph_t>& L,
const std::vector<linear_arrangement>& P = {})
166 static_assert(std::is_base_of_v<graphs::graph, graph_t>);
167 return mean_dependency_distance_1level_rational(L, P).
to_double();
Linear arrangement of vertices.
Definition: linear_arrangement.hpp:103
Exact rational number.
Definition: rational.hpp:63
double to_double() const noexcept
Converts this rational to a double-precision floating-point value.
Definition: rational.hpp:850
double mean_dependency_distance_1level(const std::vector< graph_t > &L, const std::vector< linear_arrangement > &P={}) noexcept
1-level Mean Dependency Distance over an ensemble of graphs.
Definition: 1level.hpp:163
numeric::rational mean_dependency_distance_1level_rational(const std::vector< graph_t > &L, const std::vector< linear_arrangement > &P={}) noexcept
1-level Mean Dependency Distance over an ensemble of graphs.
Definition: 1level.hpp:89
Main namespace of the library.
Definition: basic_types.hpp:50