diff --git a/D3128_Algorithms/src/bellman_shortest_dists.hpp b/D3128_Algorithms/src/bellman_shortest_dists.hpp index f0e28ca..b84b06c 100644 --- a/D3128_Algorithms/src/bellman_shortest_dists.hpp +++ b/D3128_Algorithms/src/bellman_shortest_dists.hpp @@ -1,19 +1,18 @@ template (const remove_reference_t&, - const edge_t&)>, + class DistanceFn, + class WF = function(const remove_reference_t&, + const edge_t&)>, class Visitor = empty_visitor, - class Compare = less>, - class Combine = plus>> -requires vertex_property_map_for && - is_arithmetic_v> && - basic_edge_weight_function, Compare, Combine> + class Compare = less>, + class Combine = plus>> +requires distance_fn_for && + basic_edge_weight_function, Compare, Combine> [[nodiscard]] constexpr optional> bellman_ford_shortest_distances( G&& g, const vertex_id_t& source, - Distances& distances, + DistanceFn&& distance, WF&& weight = [](const auto&, - const edge_t& uv) { return vertex_property_map_value_t(1); }, + const edge_t& uv) { return distance_fn_value_t(1); }, Visitor&& visitor = empty_visitor(), - Compare&& compare = less>(), - Combine&& combine = plus>()); + Compare&& compare = less>(), + Combine&& combine = plus>()); diff --git a/D3128_Algorithms/src/bellman_shortest_dists_multi.hpp b/D3128_Algorithms/src/bellman_shortest_dists_multi.hpp index 7656388..3e8dde6 100644 --- a/D3128_Algorithms/src/bellman_shortest_dists_multi.hpp +++ b/D3128_Algorithms/src/bellman_shortest_dists_multi.hpp @@ -1,21 +1,20 @@ template (const remove_reference_t&, - const edge_t&)>, + class DistanceFn, + class WF = function(const remove_reference_t&, + const edge_t&)>, class Visitor = empty_visitor, - class Compare = less>, - class Combine = plus>> -requires vertex_property_map_for && + class Compare = less>, + class Combine = plus>> +requires distance_fn_for && convertible_to, vertex_id_t> && - is_arithmetic_v> && - basic_edge_weight_function, Compare, Combine> + basic_edge_weight_function, Compare, Combine> [[nodiscard]] constexpr optional> bellman_ford_shortest_distances( G&& g, const Sources& sources, - Distances& distances, + DistanceFn&& distance, WF&& weight = [](const auto&, - const edge_t& uv) { return vertex_property_map_value_t(1); }, + const edge_t& uv) { return distance_fn_value_t(1); }, Visitor&& visitor = empty_visitor(), - Compare&& compare = less>(), - Combine&& combine = plus>()); + Compare&& compare = less>(), + Combine&& combine = plus>()); diff --git a/D3128_Algorithms/src/bellman_shortest_paths.hpp b/D3128_Algorithms/src/bellman_shortest_paths.hpp index e4bb496..99c6cc0 100644 --- a/D3128_Algorithms/src/bellman_shortest_paths.hpp +++ b/D3128_Algorithms/src/bellman_shortest_paths.hpp @@ -1,23 +1,21 @@ template (const remove_reference_t&, - const edge_t&)>, + class DistanceFn, + class PredecessorFn, + class WF = function(const remove_reference_t&, + const edge_t&)>, class Visitor = empty_visitor, - class Compare = less>, - class Combine = plus>> -requires vertex_property_map_for && - vertex_property_map_for && - is_arithmetic_v> && - convertible_to, vertex_property_map_value_t> && - basic_edge_weight_function, Compare, Combine> + class Compare = less>, + class Combine = plus>> +requires distance_fn_for && + predecessor_fn_for && + basic_edge_weight_function, Compare, Combine> [[nodiscard]] constexpr optional> bellman_ford_shortest_paths( G&& g, const vertex_id_t& source, - Distances& distances, - Predecessors& predecessor, + DistanceFn&& distance, + PredecessorFn&& predecessor, WF&& weight = [](const auto&, - const edge_t& uv) { return vertex_property_map_value_t(1); }, + const edge_t& uv) { return distance_fn_value_t(1); }, Visitor&& visitor = empty_visitor(), - Compare&& compare = less>(), - Combine&& combine = plus>()); + Compare&& compare = less>(), + Combine&& combine = plus>()); diff --git a/D3128_Algorithms/src/bellman_shortest_paths_multi.hpp b/D3128_Algorithms/src/bellman_shortest_paths_multi.hpp index 0f58806..57a8657 100644 --- a/D3128_Algorithms/src/bellman_shortest_paths_multi.hpp +++ b/D3128_Algorithms/src/bellman_shortest_paths_multi.hpp @@ -1,25 +1,23 @@ template (const remove_reference_t&, - const edge_t&)>, + class DistanceFn, + class PredecessorFn, + class WF = function(const remove_reference_t&, + const edge_t&)>, class Visitor = empty_visitor, - class Compare = less>, - class Combine = plus>> -requires vertex_property_map_for && - vertex_property_map_for && + class Compare = less>, + class Combine = plus>> +requires distance_fn_for && + predecessor_fn_for && convertible_to, vertex_id_t> && - is_arithmetic_v> && - convertible_to, vertex_property_map_value_t> && - basic_edge_weight_function, Compare, Combine> + basic_edge_weight_function, Compare, Combine> [[nodiscard]] constexpr optional> bellman_ford_shortest_paths( - G&& g, - const Sources& sources, - Distances& distances, - Predecessors& predecessor, - WF&& weight = [](const auto&, - const edge_t& uv) { return vertex_property_map_value_t(1); }, - Visitor&& visitor = empty_visitor(), - Compare&& compare = less>(), - Combine&& combine = plus>()); + G&& g, + const Sources& sources, + DistanceFn&& distance, + PredecessorFn&& predecessor, + WF&& weight = [](const auto&, + const edge_t& uv) { return distance_fn_value_t(1); }, + Visitor&& visitor = empty_visitor(), + Compare&& compare = less>(), + Combine&& combine = plus>()); diff --git a/D3128_Algorithms/src/connected_components.hpp b/D3128_Algorithms/src/connected_components.hpp index 23dfb62..c2594ab 100644 --- a/D3128_Algorithms/src/connected_components.hpp +++ b/D3128_Algorithms/src/connected_components.hpp @@ -14,9 +14,9 @@ void biconnected_components(G&& g, OuterContainer& components); /* * Connected Components */ -template -requires vertex_property_map_for -size_t connected_components(G&& g, Component& component); +template +requires vertex_property_fn_for +size_t connected_components(G&& g, ComponentFn&& component); /* * Afforest Connected Components @@ -32,10 +32,10 @@ void afforest(G&& g, GT&& g_t, Component& component, const size_t neighbor_round /* * Kosaraju Strongly Connected Components */ -template -requires vertex_property_map_for -void kosaraju(G&& g, GT&& g_t, Component& component); +template +requires vertex_property_fn_for +void kosaraju(G&& g, GT&& g_t, ComponentFn&& component); -template -requires vertex_property_map_for -void kosaraju(G&& g, Component& component); +template +requires vertex_property_fn_for +void kosaraju(G&& g, ComponentFn&& component); diff --git a/D3128_Algorithms/src/dijkstra_example_mapped.hpp b/D3128_Algorithms/src/dijkstra_example_mapped.hpp index 974e51f..c9017f7 100644 --- a/D3128_Algorithms/src/dijkstra_example_mapped.hpp +++ b/D3128_Algorithms/src/dijkstra_example_mapped.hpp @@ -16,14 +16,18 @@ G g({{"a", "b", 4.0}, {"a", "c", 2.0}, constexpr double inf = std::numeric_limits::max(); -auto dist = make_vertex_property_map(g, inf); -auto pred = make_vertex_property_map>(g, vertex_id_t{}); -for (auto&& [uid, u] : views::vertexlist(g)) - pred[uid] = uid; - -dijkstra_shortest_paths(g, std::string{"a"}, dist, pred, +std::unordered_map dist_map; +std::unordered_map pred_map; +for (auto&& [uid, u] : views::vertexlist(g)) { + dist_map[uid] = inf; + pred_map[uid] = uid; +} + +dijkstra_shortest_paths(g, std::string{"a"}, + [&dist_map](const auto&, const auto& uid) -> double& { return dist_map[uid]; }, + [&pred_map](const auto&, const auto& uid) -> std::string& { return pred_map[uid]; }, [](const auto& g, const edge_t& e) { return edge_value(g, e); }); // Shortest a to d: a to c (2) to b (1) to d (5) = 8 -// dist["d"] == 8 +// dist\_map["d"] == 8 diff --git a/D3128_Algorithms/src/dijkstra_shortest_dists.hpp b/D3128_Algorithms/src/dijkstra_shortest_dists.hpp index 03404d8..9bd37b8 100644 --- a/D3128_Algorithms/src/dijkstra_shortest_dists.hpp +++ b/D3128_Algorithms/src/dijkstra_shortest_dists.hpp @@ -1,19 +1,18 @@ template (const remove_reference_t&, - const edge_t&)>, + class DistanceFn, + class WF = function(const remove_reference_t&, + const edge_t&)>, class Visitor = empty_visitor, - class Compare = less>, - class Combine = plus>> -requires vertex_property_map_for && - is_arithmetic_v> && - basic_edge_weight_function, Compare, Combine> + class Compare = less>, + class Combine = plus>> +requires distance_fn_for && + basic_edge_weight_function, Compare, Combine> constexpr void dijkstra_shortest_distances( G&& g, const vertex_id_t& source, - Distances& distances, + DistanceFn&& distance, WF&& weight = [](const auto&, - const edge_t& uv) { return vertex_property_map_value_t(1); }, + const edge_t& uv) { return distance_fn_value_t(1); }, Visitor&& visitor = empty_visitor(), - Compare&& compare = less>(), - Combine&& combine = plus>()); + Compare&& compare = less>(), + Combine&& combine = plus>()); diff --git a/D3128_Algorithms/src/dijkstra_shortest_dists_multi.hpp b/D3128_Algorithms/src/dijkstra_shortest_dists_multi.hpp index 365c4f4..4213e69 100644 --- a/D3128_Algorithms/src/dijkstra_shortest_dists_multi.hpp +++ b/D3128_Algorithms/src/dijkstra_shortest_dists_multi.hpp @@ -1,21 +1,20 @@ template (const remove_reference_t&, - const edge_t&)>, + class DistanceFn, + class WF = function(const remove_reference_t&, + const edge_t&)>, class Visitor = empty_visitor, - class Compare = less>, - class Combine = plus>> -requires vertex_property_map_for && + class Compare = less>, + class Combine = plus>> +requires distance_fn_for && convertible_to, vertex_id_t> && - is_arithmetic_v> && - basic_edge_weight_function, Compare, Combine> + basic_edge_weight_function, Compare, Combine> constexpr void dijkstra_shortest_distances( G&& g, const Sources& sources, - Distances& distances, + DistanceFn&& distance, WF&& weight = [](const auto&, - const edge_t& uv) { return vertex_property_map_value_t(1); }, + const edge_t& uv) { return distance_fn_value_t(1); }, Visitor&& visitor = empty_visitor(), - Compare&& compare = less>(), - Combine&& combine = plus>()); + Compare&& compare = less>(), + Combine&& combine = plus>()); diff --git a/D3128_Algorithms/src/dijkstra_shortest_paths.hpp b/D3128_Algorithms/src/dijkstra_shortest_paths.hpp index f5d9b53..79dc4bd 100644 --- a/D3128_Algorithms/src/dijkstra_shortest_paths.hpp +++ b/D3128_Algorithms/src/dijkstra_shortest_paths.hpp @@ -1,23 +1,21 @@ template (const remove_reference_t&, - const edge_t&)>, + class DistanceFn, + class PredecessorFn, + class WF = function(const remove_reference_t&, + const edge_t&)>, class Visitor = empty_visitor, - class Compare = less>, - class Combine = plus>> -requires vertex_property_map_for && - vertex_property_map_for && - is_arithmetic_v> && - convertible_to, vertex_property_map_value_t> && - basic_edge_weight_function, Compare, Combine> + class Compare = less>, + class Combine = plus>> +requires distance_fn_for && + predecessor_fn_for && + basic_edge_weight_function, Compare, Combine> constexpr void dijkstra_shortest_paths( G&& g, const vertex_id_t& source, - Distances& distances, - Predecessors& predecessor, + DistanceFn&& distance, + PredecessorFn&& predecessor, WF&& weight = [](const auto&, - const edge_t& uv) { return vertex_property_map_value_t(1); }, + const edge_t& uv) { return distance_fn_value_t(1); }, Visitor&& visitor = empty_visitor(), - Compare&& compare = less>(), - Combine&& combine = plus>()); + Compare&& compare = less>(), + Combine&& combine = plus>()); diff --git a/D3128_Algorithms/src/dijkstra_shortest_paths_multi.hpp b/D3128_Algorithms/src/dijkstra_shortest_paths_multi.hpp index 3f765b0..9e891e0 100644 --- a/D3128_Algorithms/src/dijkstra_shortest_paths_multi.hpp +++ b/D3128_Algorithms/src/dijkstra_shortest_paths_multi.hpp @@ -1,25 +1,23 @@ template (const remove_reference_t&, - const edge_t&)>, + class DistanceFn, + class PredecessorFn, + class WF = function(const remove_reference_t&, + const edge_t&)>, class Visitor = empty_visitor, - class Compare = less>, - class Combine = plus>> -requires vertex_property_map_for && - vertex_property_map_for && + class Compare = less>, + class Combine = plus>> +requires distance_fn_for && + predecessor_fn_for && convertible_to, vertex_id_t> && - is_arithmetic_v> && - convertible_to, vertex_property_map_value_t> && - basic_edge_weight_function, Compare, Combine> + basic_edge_weight_function, Compare, Combine> constexpr void dijkstra_shortest_paths( G&& g, const Sources& sources, - Distances& distances, - Predecessors& predecessor, + DistanceFn&& distance, + PredecessorFn&& predecessor, WF&& weight = [](const auto&, - const edge_t& uv) { return vertex_property_map_value_t(1); }, + const edge_t& uv) { return distance_fn_value_t(1); }, Visitor&& visitor = empty_visitor(), - Compare&& compare = less>(), - Combine&& combine = plus>()); + Compare&& compare = less>(), + Combine&& combine = plus>()); diff --git a/D3128_Algorithms/src/lp.hpp b/D3128_Algorithms/src/lp.hpp index f6b3115..d1a25e0 100644 --- a/D3128_Algorithms/src/lp.hpp +++ b/D3128_Algorithms/src/lp.hpp @@ -2,20 +2,26 @@ * Label Propagation Algorithm */ template -void label_propagation(G&& g, - Label& label, - Gen&& rng = default_random_engine{}, - T max_iters = numeric_limits::max()); +requires vertex_property_fn_for && + equality_comparable> && + uniform_random_bit_generator> +void label_propagation(G&& g, + LabelFn&& label, + Gen&& rng = default_random_engine{}, + T max_iters = numeric_limits::max()); template -void label_propagation(G&& g, - Label& label, - vertex_property_map_value_t