15 #ifndef BELUGA_ACTIONS_REWEIGHT_HPP
16 #define BELUGA_ACTIONS_REWEIGHT_HPP
24 #include <range/v3/action/action.hpp>
25 #include <range/v3/algorithm/max_element.hpp>
26 #include <range/v3/view/common.hpp>
52 class ExecutionPolicy,
55 std::enable_if_t<std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>,
int> = 0,
56 std::enable_if_t<ranges::range<Range>,
int> = 0>
57 constexpr
auto operator()(ExecutionPolicy&&
policy, Range& range, Model model)
const -> Range& {
58 static_assert(beluga::is_particle_range_v<Range>);
67 [model = std::move(model)](
const auto& s,
auto w) {
return w * model(s); });
75 class ExecutionPolicy,
76 std::enable_if_t<ranges::range<Range>,
int> = 0,
77 std::enable_if_t<std::is_execution_policy_v<ExecutionPolicy>,
int> = 0>
78 constexpr
auto operator()(Range&& range, Model model, ExecutionPolicy
policy)
const -> Range& {
79 return (*
this)(std::move(
policy), std::forward<Range>(range), std::move(model));
83 template <
class ExecutionPolicy,
class Model, std::enable_if_t<std::is_execution_policy_v<ExecutionPolicy>,
int> = 0>
85 return ranges::make_action_closure(ranges::bind_back(
reweight_base_fn{}, std::move(model), std::move(
policy)));
91 using reweight_base_fn::operator();
94 template <
class Range,
class Model, std::enable_if_t<ranges::range<Range>,
int> = 0>
95 constexpr
auto operator()(Range&& range, Model model)
const -> Range& {
96 return (*
this)(std::execution::seq, std::forward<Range>(range), std::move(model));
100 template <
class Model>
102 return ranges::make_action_closure(ranges::bind_back(
reweight_fn{}, std::move(model)));