15template <Config Conf,
class Weight =
typename Conf::real_t>
16 requires(std::is_same_v<Weight, typename Conf::real_t> ||
17 std::is_same_v<Weight, typename Conf::vec> ||
18 std::is_same_v<Weight, typename Conf::rvec> ||
19 std::is_same_v<Weight, typename Conf::crvec>)
23 static constexpr bool scalar_weight = std::is_same_v<weight_t, real_t>;
26 const char *
msg =
"L1Norm::λ must be nonnegative";
27 if constexpr (scalar_weight) {
28 if (λ < 0 || !std::isfinite(λ))
29 throw std::invalid_argument(
msg);
31 if ((λ.array() < 0).any() || !λ.allFinite())
32 throw std::invalid_argument(
msg);
37 requires(scalar_weight)
40 requires(!scalar_weight)
50 if constexpr (scalar_weight) {
56 auto step = vec::Constant(n, λ * γ);
60 if constexpr (std::is_same_v<weight_t, vec>)
62 λ = weight_t::Ones(n);
65 assert((λ.array() >= 0).all());
74 return self.
prox(std::move(
in), std::move(
out), γ);
#define USING_ALPAQA_CONFIG(Conf)
std::decay_t< decltype(Tag)> tag_t
typename Conf::crmat crmat
typename Conf::real_t real_t
typename Conf::length_t length_t
real_t prox(crmat in, rmat out, real_t γ=1)
friend real_t alpaqa_tag_invoke(tag_t< alpaqa::prox >, L1Norm &self, crmat in, rmat out, real_t γ)