From 2f67372e17ba2a6bc7eb706f2960a0c3c9bb2b81 Mon Sep 17 00:00:00 2001 From: Ramzi Sabra Date: Mon, 25 May 2020 02:33:45 +0300 Subject: [PATCH] refactored random distribution number wrapper and test --- src/include/units/random.h | 776 ++++++++++--------- test/unit_test/runtime/distribution_test.cpp | 426 +++++----- 2 files changed, 617 insertions(+), 585 deletions(-) diff --git a/src/include/units/random.h b/src/include/units/random.h index 8570e1e9..e9bc4221 100644 --- a/src/include/units/random.h +++ b/src/include/units/random.h @@ -1,453 +1,463 @@ +// The MIT License (MIT) +// +// Copyright (c) 2018 Mateusz Pusz +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + #pragma once #include #include +#include namespace units { -template -struct uniform_int_distribution : public std::uniform_int_distribution -{ - using Rep = Quantity::rep; - using Base = std::uniform_int_distribution; - - uniform_int_distribution() : Base() {} - uniform_int_distribution(Quantity a, Quantity b) : Base(a.count(), b.count()) {} - - template - Quantity operator()(Generator& g) { return Quantity(Base::operator()(g)); } - - Quantity a() const { return Quantity(Base::a()); } - Quantity b() const { return Quantity(Base::b()); } - - Quantity min() const { return Quantity(Base::min()); } - Quantity max() const { return Quantity(Base::max()); } -}; - -template -struct uniform_real_distribution : public std::uniform_real_distribution -{ - using Rep = Quantity::rep; - using Base = std::uniform_real_distribution; - - uniform_real_distribution() : Base() {} - uniform_real_distribution(Quantity a, Quantity b) : Base(a.count(), b.count()) {} - - template - Quantity operator()(Generator& g) { return Quantity(Base::operator()(g)); } - - Quantity a() const { return Quantity(Base::a()); } - Quantity b() const { return Quantity(Base::b()); } - - Quantity min() const { return Quantity(Base::min()); } - Quantity max() const { return Quantity(Base::max()); } -}; - -template -struct binomial_distribution : public std::binomial_distribution -{ - using Rep = Quantity::rep; - using Base = std::binomial_distribution; - - binomial_distribution() : Base() {} - binomial_distribution(Quantity t, double p) : Base(t.count(), p) {} - - template - Quantity operator()(Generator& g) { return Quantity(Base::operator()(g)); } - - Quantity t() const { return Quantity(Base::t()); } - - Quantity min() const { return Quantity(Base::min()); } - Quantity max() const { return Quantity(Base::max()); } -}; - -template -struct negative_binomial_distribution : public std::negative_binomial_distribution -{ - using Rep = Quantity::rep; - using Base = std::negative_binomial_distribution; - - negative_binomial_distribution() : Base() {} - negative_binomial_distribution(Quantity k, double p) : Base(k.count(), p) {} - - template - Quantity operator()(Generator& g) { return Quantity(Base::operator()(g)); } - - Quantity k() const { return Quantity(Base::k()); } - - Quantity min() const { return Quantity(Base::min()); } - Quantity max() const { return Quantity(Base::max()); } -}; - -template -struct geometric_distribution : public std::geometric_distribution -{ - using Rep = Quantity::rep; - using Base = std::geometric_distribution; - - geometric_distribution() : Base() {} - geometric_distribution(double p) : Base(p) {} - - template - Quantity operator()(Generator& g) { return Quantity(Base::operator()(g)); } - - Quantity min() const { return Quantity(Base::min()); } - Quantity max() const { return Quantity(Base::max()); } -}; - -template -struct poisson_distribution : public std::poisson_distribution -{ - using Rep = Quantity::rep; - using Base = std::poisson_distribution; - - poisson_distribution() : Base() {} - poisson_distribution(double p) : Base(p) {} - - template - Quantity operator()(Generator& g) { return Quantity(Base::operator()(g)); } - - Quantity min() const { return Quantity(Base::min()); } - Quantity max() const { return Quantity(Base::max()); } -}; - -template -struct exponential_distribution : public std::exponential_distribution -{ - using Rep = Quantity::rep; - using Base = std::exponential_distribution; - - exponential_distribution() : Base() {} - exponential_distribution(Rep lambda) : Base(lambda) {} - - template - Quantity operator()(Generator& g) { return Quantity(Base::operator()(g)); } - - Quantity min() const { return Quantity(Base::min()); } - Quantity max() const { return Quantity(Base::max()); } -}; - -template -struct gamma_distribution : public std::gamma_distribution -{ - using Rep = Quantity::rep; - using Base = std::gamma_distribution; - - gamma_distribution() : Base() {} - gamma_distribution(Rep alpha, Rep beta) : Base(alpha, beta) {} - - template - Quantity operator()(Generator& g) { return Quantity(Base::operator()(g)); } - - Quantity min() const { return Quantity(Base::min()); } - Quantity max() const { return Quantity(Base::max()); } -}; - -template -struct weibull_distribution : public std::weibull_distribution -{ - using Rep = Quantity::rep; - using Base = std::weibull_distribution; - - weibull_distribution() : Base() {} - weibull_distribution(Rep a, Rep b) : Base(a, b) {} - - template - Quantity operator()(Generator& g) { return Quantity(Base::operator()(g)); } - - Quantity min() const { return Quantity(Base::min()); } - Quantity max() const { return Quantity(Base::max()); } -}; - -template -struct extreme_value_distribution : public std::extreme_value_distribution -{ - using Rep = Quantity::rep; - using Base = std::extreme_value_distribution; - - extreme_value_distribution() : Base() {} - extreme_value_distribution(Quantity a, Rep b) : Base(a.count(), b) {} - - template - Quantity operator()(Generator& g) { return Quantity(Base::operator()(g)); } - - Quantity a() const { return Quantity(Base::a()); } - - Quantity min() const { return Quantity(Base::min()); } - Quantity max() const { return Quantity(Base::max()); } -}; - -template -struct normal_distribution : public std::normal_distribution -{ - using Rep = Quantity::rep; - using Base = std::normal_distribution; - - normal_distribution() : Base() {} - normal_distribution(Quantity mean, Quantity stddev) : Base(mean.count(), stddev.count()) {} - - template - Quantity operator()(Generator& g) { return Quantity(Base::operator()(g)); } - - Quantity mean() const { return Quantity(Base::mean()); } - Quantity stddev() const { return Quantity(Base::stddev()); } - - Quantity min() const { return Quantity(Base::min()); } - Quantity max() const { return Quantity(Base::max()); } -}; - -template -struct lognormal_distribution : public std::lognormal_distribution -{ - using Rep = Quantity::rep; - using Base = std::lognormal_distribution; - - lognormal_distribution() : Base() {} - lognormal_distribution(Quantity m, Quantity s) : Base(m.count(), s.count()) {} - - template - Quantity operator()(Generator& g) { return Quantity(Base::operator()(g)); } - - Quantity m() const { return Quantity(Base::m()); } - Quantity s() const { return Quantity(Base::s()); } - - Quantity min() const { return Quantity(Base::min()); } - Quantity max() const { return Quantity(Base::max()); } -}; - -template -struct chi_squared_distribution : public std::chi_squared_distribution -{ - using Rep = Quantity::rep; - using Base = std::chi_squared_distribution; - - chi_squared_distribution() : Base() {} - chi_squared_distribution(Rep n) : Base(n) {} - - template - Quantity operator()(Generator& g) { return Quantity(Base::operator()(g)); } - - Quantity min() const { return Quantity(Base::min()); } - Quantity max() const { return Quantity(Base::max()); } -}; - -template -struct cauchy_distribution : public std::cauchy_distribution -{ - using Rep = Quantity::rep; - using Base = std::cauchy_distribution; - - cauchy_distribution() : Base() {} - cauchy_distribution(Quantity a, Quantity b) : Base(a.count(), b.count()) {} - - template - Quantity operator()(Generator& g) { return Quantity(Base::operator()(g)); } - - Quantity a() const { return Quantity(Base::a()); } - Quantity b() const { return Quantity(Base::b()); } - - Quantity min() const { return Quantity(Base::min()); } - Quantity max() const { return Quantity(Base::max()); } -}; - -template -struct fisher_f_distribution : public std::fisher_f_distribution -{ - using Rep = Quantity::rep; - using Base = std::fisher_f_distribution; - - fisher_f_distribution() : Base() {} - fisher_f_distribution(Rep m, Rep n) : Base(m, n) {} - - template - Quantity operator()(Generator& g) { return Quantity(Base::operator()(g)); } - - Quantity min() const { return Quantity(Base::min()); } - Quantity max() const { return Quantity(Base::max()); } -}; - -template -struct student_t_distribution : public std::student_t_distribution -{ - using Rep = Quantity::rep; - using Base = std::student_t_distribution; - - student_t_distribution() : Base() {} - student_t_distribution(Rep n) : Base(n) {} - - template - Quantity operator()(Generator& g) { return Quantity(Base::operator()(g)); } - - Quantity min() const { return Quantity(Base::min()); } - Quantity max() const { return Quantity(Base::max()); } -}; - -template -struct discrete_distribution : public std::discrete_distribution -{ - using Rep = Quantity::rep; - using Base = std::discrete_distribution; - - discrete_distribution() : Base() {} - - template - discrete_distribution(InputIt first, InputIt last) : Base(first, last) {} - - discrete_distribution(std::initializer_list weights) : Base(weights) {} - - template - discrete_distribution(std::size_t count, double xmin, double xmax, UnaryOperation unary_op) : - Base(count, xmin, xmax, unary_op) {} - - template - Quantity operator()(Generator& g) { return Quantity(Base::operator()(g)); } - - Quantity min() const { return Quantity(Base::min()); } - Quantity max() const { return Quantity(Base::max()); } -}; - -template -class piecewise_constant_distribution : public std::piecewise_constant_distribution -{ - using Rep = Quantity::rep; - using Base = std::piecewise_constant_distribution; - - template - inline static std::vector i_qty_to_rep(InputIt first, InputIt last) +namespace detail { + template + static std::vector i_qty_to_rep(InputIt first, InputIt last) { - std::vector intervals_rep; + std::vector intervals_rep; intervals_rep.reserve(static_cast(std::distance(first, last))); for (auto itr = first; itr != last; ++itr) { intervals_rep.push_back(itr->count()); } return intervals_rep; } - inline static std::vector bl_qty_to_rep(std::initializer_list& bl) + template + static std::vector bl_qty_to_rep(std::initializer_list& bl) { - std::vector bl_rep; + std::vector bl_rep; bl_rep.reserve(bl.size()); - for (const Quantity& qty : bl) { bl_rep.push_back(qty.count()); } + for (const Q& qty : bl) { bl_rep.push_back(qty.count()); } return bl_rep; } - template - inline static std::vector fw_bl(std::initializer_list& bl, UnaryOperation fw) + template + inline static std::vector fw_bl_pwc(std::initializer_list& bl, UnaryOperation fw) { - std::vector w_bl; + using rep = Q::rep; + std::vector w_bl; w_bl.reserve(bl.size()); - for (const Quantity& qty : bl) { w_bl.push_back(fw(qty)); } - std::vector weights; + for (const Q& qty : bl) { w_bl.push_back(fw(qty)); } + std::vector weights; weights.reserve(bl.size()); for (size_t i = 0; i < bl.size() - 1; ++i) { weights.push_back(w_bl[i] + w_bl[i + 1]); } weights.push_back(0); return weights; } + + template + static std::vector fw_bl_pwl(std::initializer_list& bl, UnaryOperation fw) + { + std::vector weights; + weights.reserve(bl.size()); + for (const Q& qty : bl) { weights.push_back(fw(qty)); } + return weights; + } +} // namespace detail + +template +struct uniform_int_distribution : public std::uniform_int_distribution +{ + using rep = Q::rep; + using base = std::uniform_int_distribution; + + explicit uniform_int_distribution() : base() {} + uniform_int_distribution(const Q& a, const Q& b) : base(a.count(), b.count()) {} + + template + Q operator()(Generator& g) { return Q(base::operator()(g)); } + + Q a() const { return Q(base::a()); } + Q b() const { return Q(base::b()); } + + Q min() const { return Q(base::min()); } + Q max() const { return Q(base::max()); } +}; + +template +struct uniform_real_distribution : public std::uniform_real_distribution +{ + using rep = Q::rep; + using base = std::uniform_real_distribution; + + explicit uniform_real_distribution() : base() {} + uniform_real_distribution(const Q& a, const Q& b) : base(a.count(), b.count()) {} + + template + Q operator()(Generator& g) { return Q(base::operator()(g)); } + + Q a() const { return Q(base::a()); } + Q b() const { return Q(base::b()); } + + Q min() const { return Q(base::min()); } + Q max() const { return Q(base::max()); } +}; + +template +struct binomial_distribution : public std::binomial_distribution +{ + using rep = Q::rep; + using base = std::binomial_distribution; + + explicit binomial_distribution() : base() {} + binomial_distribution(const Q& t, double p) : base(t.count(), p) {} + + template + Q operator()(Generator& g) { return Q(base::operator()(g)); } + + Q t() const { return Q(base::t()); } + + Q min() const { return Q(base::min()); } + Q max() const { return Q(base::max()); } +}; + +template +struct negative_binomial_distribution : public std::negative_binomial_distribution +{ + using rep = Q::rep; + using base = std::negative_binomial_distribution; + + explicit negative_binomial_distribution() : base() {} + negative_binomial_distribution(const Q& k, double p) : base(k.count(), p) {} + + template + Q operator()(Generator& g) { return Q(base::operator()(g)); } + + Q k() const { return Q(base::k()); } + + Q min() const { return Q(base::min()); } + Q max() const { return Q(base::max()); } +}; + +template +struct geometric_distribution : public std::geometric_distribution +{ + using rep = Q::rep; + using base = std::geometric_distribution; + + explicit geometric_distribution() : base() {} + geometric_distribution(double p) : base(p) {} + + template + Q operator()(Generator& g) { return Q(base::operator()(g)); } + + Q min() const { return Q(base::min()); } + Q max() const { return Q(base::max()); } +}; + +template +struct poisson_distribution : public std::poisson_distribution +{ + using rep = Q::rep; + using base = std::poisson_distribution; + + explicit poisson_distribution() : base() {} + explicit poisson_distribution(double p) : base(p) {} + + template + Q operator()(Generator& g) { return Q(base::operator()(g)); } + + Q min() const { return Q(base::min()); } + Q max() const { return Q(base::max()); } +}; + +template +struct exponential_distribution : public std::exponential_distribution +{ + using rep = Q::rep; + using base = std::exponential_distribution; + + explicit exponential_distribution() : base() {} + explicit exponential_distribution(rep lambda) : base(lambda) {} + + template + Q operator()(Generator& g) { return Q(base::operator()(g)); } + + Q min() const { return Q(base::min()); } + Q max() const { return Q(base::max()); } +}; + +template +struct gamma_distribution : public std::gamma_distribution +{ + using rep = Q::rep; + using base = std::gamma_distribution; + + explicit gamma_distribution() : base() {} + gamma_distribution(rep alpha, rep beta) : base(alpha, beta) {} + + template + Q operator()(Generator& g) { return Q(base::operator()(g)); } + + Q min() const { return Q(base::min()); } + Q max() const { return Q(base::max()); } +}; + +template +struct weibull_distribution : public std::weibull_distribution +{ + using rep = Q::rep; + using base = std::weibull_distribution; + + explicit weibull_distribution() : base() {} + weibull_distribution(rep a, rep b) : base(a, b) {} + + template + Q operator()(Generator& g) { return Q(base::operator()(g)); } + + Q min() const { return Q(base::min()); } + Q max() const { return Q(base::max()); } +}; + +template +struct extreme_value_distribution : public std::extreme_value_distribution +{ + using rep = Q::rep; + using base = std::extreme_value_distribution; + + explicit extreme_value_distribution() : base() {} + extreme_value_distribution(const Q& a, rep b) : base(a.count(), b) {} + + template + Q operator()(Generator& g) { return Q(base::operator()(g)); } + + Q a() const { return Q(base::a()); } + + Q min() const { return Q(base::min()); } + Q max() const { return Q(base::max()); } +}; + +template +struct normal_distribution : public std::normal_distribution +{ + using rep = Q::rep; + using base = std::normal_distribution; + + explicit normal_distribution() : base() {} + normal_distribution(const Q& mean, const Q& stddev) : base(mean.count(), stddev.count()) {} + + template + Q operator()(Generator& g) { return Q(base::operator()(g)); } + + Q mean() const { return Q(base::mean()); } + Q stddev() const { return Q(base::stddev()); } + + Q min() const { return Q(base::min()); } + Q max() const { return Q(base::max()); } +}; + +template +struct lognormal_distribution : public std::lognormal_distribution +{ + using rep = Q::rep; + using base = std::lognormal_distribution; + + explicit lognormal_distribution() : base() {} + lognormal_distribution(const Q& m, const Q& s) : base(m.count(), s.count()) {} + + template + Q operator()(Generator& g) { return Q(base::operator()(g)); } + + Q m() const { return Q(base::m()); } + Q s() const { return Q(base::s()); } + + Q min() const { return Q(base::min()); } + Q max() const { return Q(base::max()); } +}; + +template +struct chi_squared_distribution : public std::chi_squared_distribution +{ + using rep = Q::rep; + using base = std::chi_squared_distribution; + + explicit chi_squared_distribution() : base() {} + explicit chi_squared_distribution(rep n) : base(n) {} + + template + Q operator()(Generator& g) { return Q(base::operator()(g)); } + + Q min() const { return Q(base::min()); } + Q max() const { return Q(base::max()); } +}; + +template +struct cauchy_distribution : public std::cauchy_distribution +{ + using rep = Q::rep; + using base = std::cauchy_distribution; + + explicit cauchy_distribution() : base() {} + cauchy_distribution(const Q& a, const Q& b) : base(a.count(), b.count()) {} + + template + Q operator()(Generator& g) { return Q(base::operator()(g)); } + + Q a() const { return Q(base::a()); } + Q b() const { return Q(base::b()); } + + Q min() const { return Q(base::min()); } + Q max() const { return Q(base::max()); } +}; + +template +struct fisher_f_distribution : public std::fisher_f_distribution +{ + using rep = Q::rep; + using base = std::fisher_f_distribution; + + explicit fisher_f_distribution() : base() {} + fisher_f_distribution(rep m, rep n) : base(m, n) {} + + template + Q operator()(Generator& g) { return Q(base::operator()(g)); } + + Q min() const { return Q(base::min()); } + Q max() const { return Q(base::max()); } +}; + +template +struct student_t_distribution : public std::student_t_distribution +{ + using rep = Q::rep; + using base = std::student_t_distribution; + + explicit student_t_distribution() : base() {} + explicit student_t_distribution(rep n) : base(n) {} + + template + Q operator()(Generator& g) { return Q(base::operator()(g)); } + + Q min() const { return Q(base::min()); } + Q max() const { return Q(base::max()); } +}; + +template +struct discrete_distribution : public std::discrete_distribution +{ + using rep = Q::rep; + using base = std::discrete_distribution; + + explicit discrete_distribution() : base() {} template - piecewise_constant_distribution(const std::vector& i, InputIt first_w) : - Base(i.cbegin(), i.cend(), first_w) {} + discrete_distribution(InputIt first, InputIt last) : base(first, last) {} + + discrete_distribution(std::initializer_list weights) : base(weights) {} + + template + discrete_distribution(std::size_t count, double xmin, double xmax, UnaryOperation unary_op) : + base(count, xmin, xmax, unary_op) {} - piecewise_constant_distribution(const std::vector& bl, const std::vector& weights) : - Base(bl.cbegin(), bl.cend(), weights.cbegin()) {} + template + Q operator()(Generator& g) { return Q(base::operator()(g)); } + + Q min() const { return Q(base::min()); } + Q max() const { return Q(base::max()); } +}; + +template +class piecewise_constant_distribution : public std::piecewise_constant_distribution +{ + using rep = Q::rep; + using base = std::piecewise_constant_distribution; + + template + piecewise_constant_distribution(const std::vector& i, InputIt first_w) : + base(i.cbegin(), i.cend(), first_w) {} + + piecewise_constant_distribution(const std::vector& bl, const std::vector& weights) : + base(bl.cbegin(), bl.cend(), weights.cbegin()) {} public: - piecewise_constant_distribution() : Base() {} + explicit piecewise_constant_distribution() : base() {} template piecewise_constant_distribution(InputIt1 first_i, InputIt1 last_i, InputIt2 first_w) : - piecewise_constant_distribution(i_qty_to_rep(first_i, last_i), first_w) {} + piecewise_constant_distribution(detail::i_qty_to_rep(first_i, last_i), first_w) {} template - piecewise_constant_distribution(std::initializer_list bl, UnaryOperation fw) : - piecewise_constant_distribution(bl_qty_to_rep(bl), fw_bl(bl, fw)) {} + piecewise_constant_distribution(std::initializer_list bl, UnaryOperation fw) : + piecewise_constant_distribution(detail::bl_qty_to_rep(bl), detail::fw_bl_pwc(bl, fw)) {} template - piecewise_constant_distribution(std::size_t nw, Quantity xmin, Quantity xmax, UnaryOperation fw) : - Base(nw, xmin.count(), xmax.count(), [fw](Rep val) { return fw(Quantity(val)); }) {} + piecewise_constant_distribution(std::size_t nw, const Q& xmin, const Q& xmax, UnaryOperation fw) : + base(nw, xmin.count(), xmax.count(), [fw](rep val) { return fw(Q(val)); }) {} template - Quantity operator()(Generator& g) { return Quantity(Base::operator()(g)); } + Q operator()(Generator& g) { return Q(base::operator()(g)); } - std::vector intervals() const + std::vector intervals() const { - std::vector intervals_rep = Base::intervals(); - std::vector intervals_qty; + std::vector intervals_rep = base::intervals(); + std::vector intervals_qty; intervals_qty.reserve(intervals_rep.size()); - for (const Rep& val : intervals_rep) { intervals_qty.push_back(Quantity(val)); } + for (const rep& val : intervals_rep) { intervals_qty.push_back(Q(val)); } return intervals_qty; } - Quantity min() const { return Quantity(Base::min()); } - Quantity max() const { return Quantity(Base::max()); } + Q min() const { return Q(base::min()); } + Q max() const { return Q(base::max()); } }; -template -class piecewise_linear_distribution : public std::piecewise_linear_distribution +template +class piecewise_linear_distribution : public std::piecewise_linear_distribution { - using Rep = Quantity::rep; - using Base = std::piecewise_linear_distribution; - - template - inline static std::vector i_qty_to_rep(InputIt first, InputIt last) - { - std::vector intervals_rep; - intervals_rep.reserve(static_cast(std::distance(first, last))); - for (auto itr = first; itr != last; ++itr) { intervals_rep.push_back(itr->count()); } - return intervals_rep; - } - - inline static std::vector bl_qty_to_rep(std::initializer_list& bl) - { - std::vector bl_rep; - bl_rep.reserve(bl.size()); - for (const Quantity& qty : bl) { bl_rep.push_back(qty.count()); } - return bl_rep; - } - - template - inline static std::vector fw_bl(std::initializer_list& bl, UnaryOperation fw) - { - std::vector weights; - weights.reserve(bl.size()); - for (const Quantity& qty : bl) { weights.push_back(fw(qty)); } - return weights; - } + using rep = Q::rep; + using base = std::piecewise_linear_distribution; template - piecewise_linear_distribution(const std::vector& i, InputIt first_w) : - Base(i.cbegin(), i.cend(), first_w) {} + piecewise_linear_distribution(const std::vector& i, InputIt first_w) : + base(i.cbegin(), i.cend(), first_w) {} - piecewise_linear_distribution(const std::vector& bl, const std::vector& weights) : - Base(bl.cbegin(), bl.cend(), weights.cbegin()) {} + piecewise_linear_distribution(const std::vector& bl, const std::vector& weights) : + base(bl.cbegin(), bl.cend(), weights.cbegin()) {} public: - piecewise_linear_distribution() : Base() {} + explicit piecewise_linear_distribution() : base() {} template piecewise_linear_distribution(InputIt1 first_i, InputIt1 last_i, InputIt2 first_w) : - piecewise_linear_distribution(i_qty_to_rep(first_i, last_i), first_w) {} + piecewise_linear_distribution(detail::i_qty_to_rep(first_i, last_i), first_w) {} template - piecewise_linear_distribution(std::initializer_list bl, UnaryOperation fw) : - piecewise_linear_distribution(bl_qty_to_rep(bl), fw_bl(bl, fw)) {} + piecewise_linear_distribution(std::initializer_list bl, UnaryOperation fw) : + piecewise_linear_distribution(detail::bl_qty_to_rep(bl), detail::fw_bl_pwl(bl, fw)) {} template - piecewise_linear_distribution(std::size_t nw, Quantity xmin, Quantity xmax, UnaryOperation fw) : - Base(nw, xmin.count(), xmax.count(), [fw](Rep val) { return fw(Quantity(val)); }) {} + piecewise_linear_distribution(std::size_t nw, const Q& xmin, const Q& xmax, UnaryOperation fw) : + base(nw, xmin.count(), xmax.count(), [fw](rep val) { return fw(Q(val)); }) {} template - Quantity operator()(Generator& g) { return Quantity(Base::operator()(g)); } + Q operator()(Generator& g) { return Q(base::operator()(g)); } - std::vector intervals() const + std::vector intervals() const { - std::vector intervals_rep = Base::intervals(); - std::vector intervals_qty; + std::vector intervals_rep = base::intervals(); + std::vector intervals_qty; intervals_qty.reserve(intervals_rep.size()); - for (const Rep& val : intervals_rep) { intervals_qty.push_back(Quantity(val)); } + for (const rep& val : intervals_rep) { intervals_qty.push_back(Q(val)); } return intervals_qty; } - Quantity min() const { return Quantity(Base::min()); } - Quantity max() const { return Quantity(Base::max()); } + Q min() const { return Q(base::min()); } + Q max() const { return Q(base::max()); } }; -} // namespace units \ No newline at end of file +} // namespace units diff --git a/test/unit_test/runtime/distribution_test.cpp b/test/unit_test/runtime/distribution_test.cpp index 37e74792..9422fd90 100644 --- a/test/unit_test/runtime/distribution_test.cpp +++ b/test/unit_test/runtime/distribution_test.cpp @@ -1,3 +1,25 @@ +// The MIT License (MIT) +// +// Copyright (c) 2018 Mateusz Pusz +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + #include #include #include @@ -8,120 +30,120 @@ using namespace units::physical::si; TEST_CASE("uniform_int_distribution") { - using Rep = std::int64_t; - using Qty = length; + using rep = std::int64_t; + using q = length; SECTION("default") { - auto dist = units::uniform_int_distribution(); + auto dist = units::uniform_int_distribution(); - CHECK(dist.a() == Qty::zero()); - CHECK(dist.b() == Qty::max()); + CHECK(dist.a() == q::zero()); + CHECK(dist.b() == q::max()); } SECTION ("parametrized") { - constexpr Rep a = 5; - constexpr Rep b = 2; + constexpr rep a = 5; + constexpr rep b = 2; auto stl_dist = std::uniform_int_distribution(a, b); - auto units_dist = units::uniform_int_distribution(Qty(a), Qty(b)); + auto units_dist = units::uniform_int_distribution(q(a), q(b)); - CHECK(units_dist.a() == Qty(stl_dist.a())); - CHECK(units_dist.b() == Qty(stl_dist.b())); - CHECK(units_dist.min() == Qty(stl_dist.min())); - CHECK(units_dist.max() == Qty(stl_dist.max())); + CHECK(units_dist.a() == q(stl_dist.a())); + CHECK(units_dist.b() == q(stl_dist.b())); + CHECK(units_dist.min() == q(stl_dist.min())); + CHECK(units_dist.max() == q(stl_dist.max())); } } TEST_CASE("uniform_real_distribution") { - using Rep = long double; - using Qty = length; + using rep = long double; + using q = length; SECTION("default") { - auto dist = units::uniform_real_distribution(); + auto dist = units::uniform_real_distribution(); - CHECK(dist.a() == Qty::zero()); - CHECK(dist.b() == Qty::one()); + CHECK(dist.a() == q::zero()); + CHECK(dist.b() == q::one()); } SECTION ("parametrized") { - constexpr Rep a = 5.0; - constexpr Rep b = 2.0; + constexpr rep a = 5.0; + constexpr rep b = 2.0; auto stl_dist = std::uniform_real_distribution(a, b); - auto units_dist = units::uniform_real_distribution(Qty(a), Qty(b)); + auto units_dist = units::uniform_real_distribution(q(a), q(b)); - CHECK(units_dist.a() == Qty(stl_dist.a())); - CHECK(units_dist.b() == Qty(stl_dist.b())); - CHECK(units_dist.min() == Qty(stl_dist.min())); - CHECK(units_dist.max() == Qty(stl_dist.max())); + CHECK(units_dist.a() == q(stl_dist.a())); + CHECK(units_dist.b() == q(stl_dist.b())); + CHECK(units_dist.min() == q(stl_dist.min())); + CHECK(units_dist.max() == q(stl_dist.max())); } } TEST_CASE("binomial_distribution") { - using Rep = std::int64_t; - using Qty = length; + using rep = std::int64_t; + using q = length; SECTION("default") { - auto dist = units::binomial_distribution(); + auto dist = units::binomial_distribution(); CHECK(dist.p() == 0.5); - CHECK(dist.t() == Qty::one()); + CHECK(dist.t() == q::one()); } SECTION ("parametrized") { - constexpr Rep t = 5; + constexpr rep t = 5; constexpr double p = 0.25; auto stl_dist = std::binomial_distribution(t, p); - auto units_dist = units::binomial_distribution(Qty(t), p); + auto units_dist = units::binomial_distribution(q(t), p); CHECK(units_dist.p() == stl_dist.p()); - CHECK(units_dist.t() == Qty(stl_dist.t())); - CHECK(units_dist.min() == Qty(stl_dist.min())); - CHECK(units_dist.max() == Qty(stl_dist.max())); + CHECK(units_dist.t() == q(stl_dist.t())); + CHECK(units_dist.min() == q(stl_dist.min())); + CHECK(units_dist.max() == q(stl_dist.max())); } } TEST_CASE("negative_binomial_distribution") { - using Rep = std::int64_t; - using Qty = length; + using rep = std::int64_t; + using q = length; SECTION("default") { - auto dist = units::negative_binomial_distribution(); + auto dist = units::negative_binomial_distribution(); CHECK(dist.p() == 0.5); - CHECK(dist.k() == Qty::one()); + CHECK(dist.k() == q::one()); } SECTION ("parametrized") { - constexpr Rep k = 5; + constexpr rep k = 5; constexpr double p = 0.25; auto stl_dist = std::negative_binomial_distribution(k, p); - auto units_dist = units::negative_binomial_distribution(Qty(k), p); + auto units_dist = units::negative_binomial_distribution(q(k), p); CHECK(units_dist.p() == stl_dist.p()); - CHECK(units_dist.k() == Qty(stl_dist.k())); - CHECK(units_dist.min() == Qty(stl_dist.min())); - CHECK(units_dist.max() == Qty(stl_dist.max())); + CHECK(units_dist.k() == q(stl_dist.k())); + CHECK(units_dist.min() == q(stl_dist.min())); + CHECK(units_dist.max() == q(stl_dist.max())); } } TEST_CASE("geometric_distribution") { - using Rep = std::int64_t; - using Qty = length; + using rep = std::int64_t; + using q = length; SECTION("default") { - auto dist = units::geometric_distribution(); + auto dist = units::geometric_distribution(); CHECK(dist.p() == 0.5); } @@ -129,23 +151,23 @@ TEST_CASE("geometric_distribution") SECTION ("parametrized") { constexpr double p = 0.25; - auto stl_dist = std::geometric_distribution(p); - auto units_dist = units::geometric_distribution(p); + auto stl_dist = std::geometric_distribution(p); + auto units_dist = units::geometric_distribution(p); CHECK(units_dist.p() == stl_dist.p()); - CHECK(units_dist.min() == Qty(stl_dist.min())); - CHECK(units_dist.max() == Qty(stl_dist.max())); + CHECK(units_dist.min() == q(stl_dist.min())); + CHECK(units_dist.max() == q(stl_dist.max())); } } TEST_CASE("poisson_distribution") { - using Rep = std::int64_t; - using Qty = length; + using rep = std::int64_t; + using q = length; SECTION("default") { - auto dist = units::poisson_distribution(); + auto dist = units::poisson_distribution(); CHECK(dist.mean() == 1.0); } @@ -153,23 +175,23 @@ TEST_CASE("poisson_distribution") SECTION ("parametrized") { constexpr double mean = 5.0; - auto stl_dist = std::poisson_distribution(mean); - auto units_dist = units::poisson_distribution(mean); + auto stl_dist = std::poisson_distribution(mean); + auto units_dist = units::poisson_distribution(mean); CHECK(units_dist.mean() == stl_dist.mean()); - CHECK(units_dist.min() == Qty(stl_dist.min())); - CHECK(units_dist.max() == Qty(stl_dist.max())); + CHECK(units_dist.min() == q(stl_dist.min())); + CHECK(units_dist.max() == q(stl_dist.max())); } } TEST_CASE("exponential_distribution") { - using Rep = long double; - using Qty = length; + using rep = long double; + using q = length; SECTION("default") { - auto dist = units::exponential_distribution(); + auto dist = units::exponential_distribution(); CHECK(dist.lambda() == 1.0); } @@ -177,23 +199,23 @@ TEST_CASE("exponential_distribution") SECTION ("parametrized") { constexpr double lambda = 2.0; - auto stl_dist = std::exponential_distribution(lambda); - auto units_dist = units::exponential_distribution(lambda); + auto stl_dist = std::exponential_distribution(lambda); + auto units_dist = units::exponential_distribution(lambda); CHECK(units_dist.lambda() == stl_dist.lambda()); - CHECK(units_dist.min() == Qty(stl_dist.min())); - CHECK(units_dist.max() == Qty(stl_dist.max())); + CHECK(units_dist.min() == q(stl_dist.min())); + CHECK(units_dist.max() == q(stl_dist.max())); } } TEST_CASE("gamma_distribution") { - using Rep = long double; - using Qty = length; + using rep = long double; + using q = length; SECTION("default") { - auto dist = units::gamma_distribution(); + auto dist = units::gamma_distribution(); CHECK(dist.alpha() == 1.0); CHECK(dist.beta() == 1.0); @@ -203,249 +225,249 @@ TEST_CASE("gamma_distribution") constexpr double alpha = 5.0; constexpr double beta = 2.0; - auto stl_dist = std::gamma_distribution(alpha, beta); - auto units_dist = units::gamma_distribution(alpha, beta); + auto stl_dist = std::gamma_distribution(alpha, beta); + auto units_dist = units::gamma_distribution(alpha, beta); CHECK(units_dist.alpha() == stl_dist.alpha()); CHECK(units_dist.beta() == stl_dist.beta()); - CHECK(units_dist.min() == Qty(stl_dist.min())); - CHECK(units_dist.max() == Qty(stl_dist.max())); + CHECK(units_dist.min() == q(stl_dist.min())); + CHECK(units_dist.max() == q(stl_dist.max())); } } TEST_CASE("weibull_distribution") { - using Rep = long double; - using Qty = length; + using rep = long double; + using q = length; SECTION("default") { - auto dist = units::weibull_distribution(); + auto dist = units::weibull_distribution(); CHECK(dist.a() == 1.0); CHECK(dist.b() == 1.0); } SECTION ("parametrized") { - constexpr Rep a = 5.0; - constexpr Rep b = 2.0; + constexpr rep a = 5.0; + constexpr rep b = 2.0; auto stl_dist = std::weibull_distribution(a, b); - auto units_dist = units::weibull_distribution(a, b); + auto units_dist = units::weibull_distribution(a, b); CHECK(units_dist.a() == stl_dist.a()); CHECK(units_dist.b() == stl_dist.b()); - CHECK(units_dist.min() == Qty(stl_dist.min())); - CHECK(units_dist.max() == Qty(stl_dist.max())); + CHECK(units_dist.min() == q(stl_dist.min())); + CHECK(units_dist.max() == q(stl_dist.max())); } } TEST_CASE("extreme_value_distribution") { - using Rep = long double; - using Qty = length; + using rep = long double; + using q = length; SECTION("default") { - auto dist = units::extreme_value_distribution(); + auto dist = units::extreme_value_distribution(); - CHECK(dist.a() == Qty::zero()); + CHECK(dist.a() == q::zero()); CHECK(dist.b() == 1.0); } SECTION ("parametrized") { - constexpr Rep a = 5.0; - constexpr Rep b = 2.0; + constexpr rep a = 5.0; + constexpr rep b = 2.0; auto stl_dist = std::extreme_value_distribution(a, b); - auto units_dist = units::extreme_value_distribution(Qty(a), b); + auto units_dist = units::extreme_value_distribution(q(a), b); - CHECK(units_dist.a() == Qty(stl_dist.a())); + CHECK(units_dist.a() == q(stl_dist.a())); CHECK(units_dist.b() == stl_dist.b()); - CHECK(units_dist.min() == Qty(stl_dist.min())); - CHECK(units_dist.max() == Qty(stl_dist.max())); + CHECK(units_dist.min() == q(stl_dist.min())); + CHECK(units_dist.max() == q(stl_dist.max())); } } TEST_CASE("normal_distribution") { - using Rep = long double; - using Qty = length; + using rep = long double; + using q = length; SECTION("default") { - auto dist = units::normal_distribution(); + auto dist = units::normal_distribution(); - CHECK(dist.mean() == Qty::zero()); - CHECK(dist.stddev() == Qty::one()); + CHECK(dist.mean() == q::zero()); + CHECK(dist.stddev() == q::one()); } SECTION("parametrized") { - constexpr Rep mean = 5.0; - constexpr Rep stddev = 2.0; + constexpr rep mean = 5.0; + constexpr rep stddev = 2.0; auto stl_dist = std::normal_distribution(mean, stddev); - auto units_dist = units::normal_distribution(Qty(mean), Qty(stddev)); + auto units_dist = units::normal_distribution(q(mean), q(stddev)); - CHECK(units_dist.mean() == Qty(stl_dist.mean())); - CHECK(units_dist.stddev() == Qty(stl_dist.stddev())); - CHECK(units_dist.min() == Qty(stl_dist.min())); - CHECK(units_dist.max() == Qty(stl_dist.max())); + CHECK(units_dist.mean() == q(stl_dist.mean())); + CHECK(units_dist.stddev() == q(stl_dist.stddev())); + CHECK(units_dist.min() == q(stl_dist.min())); + CHECK(units_dist.max() == q(stl_dist.max())); } } TEST_CASE("lognormal_distribution") { - using Rep = long double; - using Qty = length; + using rep = long double; + using q = length; SECTION("default") { - auto dist = units::lognormal_distribution(); + auto dist = units::lognormal_distribution(); - CHECK(dist.m() == Qty::zero()); - CHECK(dist.s() == Qty::one()); + CHECK(dist.m() == q::zero()); + CHECK(dist.s() == q::one()); } SECTION("parametrized") { - constexpr Rep m = 5.0; - constexpr Rep s = 2.0; + constexpr rep m = 5.0; + constexpr rep s = 2.0; auto stl_dist = std::lognormal_distribution(m, s); - auto units_dist = units::lognormal_distribution(Qty(m), Qty(s)); + auto units_dist = units::lognormal_distribution(q(m), q(s)); - CHECK(units_dist.m() == Qty(stl_dist.m())); - CHECK(units_dist.s() == Qty(stl_dist.s())); - CHECK(units_dist.min() == Qty(stl_dist.min())); - CHECK(units_dist.max() == Qty(stl_dist.max())); + CHECK(units_dist.m() == q(stl_dist.m())); + CHECK(units_dist.s() == q(stl_dist.s())); + CHECK(units_dist.min() == q(stl_dist.min())); + CHECK(units_dist.max() == q(stl_dist.max())); } } TEST_CASE("chi_squared_distribution") { - using Rep = long double; - using Qty = length; + using rep = long double; + using q = length; SECTION("default") { - auto dist = units::chi_squared_distribution(); + auto dist = units::chi_squared_distribution(); CHECK(dist.n() == 1.0); } SECTION("parametrized") { - constexpr Rep n = 5.0; + constexpr rep n = 5.0; auto stl_dist = std::chi_squared_distribution(n); - auto units_dist = units::chi_squared_distribution(n); + auto units_dist = units::chi_squared_distribution(n); CHECK(units_dist.n() == stl_dist.n()); - CHECK(units_dist.min() == Qty(stl_dist.min())); - CHECK(units_dist.max() == Qty(stl_dist.max())); + CHECK(units_dist.min() == q(stl_dist.min())); + CHECK(units_dist.max() == q(stl_dist.max())); } } TEST_CASE("cauchy_distribution") { - using Rep = long double; - using Qty = length; + using rep = long double; + using q = length; SECTION("default") { - auto dist = units::cauchy_distribution(); + auto dist = units::cauchy_distribution(); - CHECK(dist.a() == Qty::zero()); - CHECK(dist.b() == Qty::one()); + CHECK(dist.a() == q::zero()); + CHECK(dist.b() == q::one()); } SECTION ("parametrized") { - constexpr Rep a = 5.0; - constexpr Rep b = 2.0; + constexpr rep a = 5.0; + constexpr rep b = 2.0; auto stl_dist = std::cauchy_distribution(a, b); - auto units_dist = units::cauchy_distribution(Qty(a), Qty(b)); + auto units_dist = units::cauchy_distribution(q(a), q(b)); - CHECK(units_dist.a() == Qty(stl_dist.a())); - CHECK(units_dist.b() == Qty(stl_dist.b())); - CHECK(units_dist.min() == Qty(stl_dist.min())); - CHECK(units_dist.max() == Qty(stl_dist.max())); + CHECK(units_dist.a() == q(stl_dist.a())); + CHECK(units_dist.b() == q(stl_dist.b())); + CHECK(units_dist.min() == q(stl_dist.min())); + CHECK(units_dist.max() == q(stl_dist.max())); } } TEST_CASE("fisher_f_distribution") { - using Rep = long double; - using Qty = length; + using rep = long double; + using q = length; SECTION("default") { - auto dist = units::fisher_f_distribution(); + auto dist = units::fisher_f_distribution(); CHECK(dist.m() == 1.0); CHECK(dist.n() == 1.0); } SECTION ("parametrized") { - constexpr Rep m = 5.0; - constexpr Rep n = 2.0; + constexpr rep m = 5.0; + constexpr rep n = 2.0; - auto stl_dist = std::fisher_f_distribution(m, n); - auto units_dist = units::fisher_f_distribution(m, n); + auto stl_dist = std::fisher_f_distribution(m, n); + auto units_dist = units::fisher_f_distribution(m, n); CHECK(units_dist.m() == stl_dist.m()); CHECK(units_dist.n() == stl_dist.n()); - CHECK(units_dist.min() == Qty(stl_dist.min())); - CHECK(units_dist.max() == Qty(stl_dist.max())); + CHECK(units_dist.min() == q(stl_dist.min())); + CHECK(units_dist.max() == q(stl_dist.max())); } } TEST_CASE("student_t_distribution") { - using Rep = long double; - using Qty = length; + using rep = long double; + using q = length; SECTION("default") { - auto dist = units::student_t_distribution(); + auto dist = units::student_t_distribution(); CHECK(dist.n() == 1.0); } SECTION ("parametrized") { - constexpr Rep n = 2.0; + constexpr rep n = 2.0; - auto stl_dist = std::student_t_distribution(n); - auto units_dist = units::student_t_distribution(n); + auto stl_dist = std::student_t_distribution(n); + auto units_dist = units::student_t_distribution(n); CHECK(units_dist.n() == stl_dist.n()); - CHECK(units_dist.min() == Qty(stl_dist.min())); - CHECK(units_dist.max() == Qty(stl_dist.max())); + CHECK(units_dist.min() == q(stl_dist.min())); + CHECK(units_dist.max() == q(stl_dist.max())); } } TEST_CASE("discrete_distribution") { - using Rep = std::int64_t; - using Qty = length; + using rep = std::int64_t; + using q = length; SECTION("default") { - auto stl_dist = std::discrete_distribution(); - auto units_dist = units::discrete_distribution(); + auto stl_dist = std::discrete_distribution(); + auto units_dist = units::discrete_distribution(); - CHECK(units_dist.min() == Qty(stl_dist.min())); - CHECK(units_dist.max() == Qty(stl_dist.max())); + CHECK(units_dist.min() == q(stl_dist.min())); + CHECK(units_dist.max() == q(stl_dist.max())); CHECK(units_dist.probabilities() == stl_dist.probabilities()); } SECTION ("parametrized_input_it") { constexpr std::array weights = {1.0, 2.0, 3.0}; - auto stl_dist = std::discrete_distribution(weights.cbegin(), weights.cend()); - auto units_dist = units::discrete_distribution(weights.cbegin(), weights.cend()); + auto stl_dist = std::discrete_distribution(weights.cbegin(), weights.cend()); + auto units_dist = units::discrete_distribution(weights.cbegin(), weights.cend()); CHECK(units_dist.probabilities() == stl_dist.probabilities()); } @@ -453,8 +475,8 @@ TEST_CASE("discrete_distribution") SECTION ("parametrized_initializer_list") { std::initializer_list weights = {1.0, 2.0, 3.0}; - auto stl_dist = std::discrete_distribution(weights); - auto units_dist = units::discrete_distribution(weights); + auto stl_dist = std::discrete_distribution(weights); + auto units_dist = units::discrete_distribution(weights); CHECK(units_dist.probabilities() == stl_dist.probabilities()); } @@ -463,8 +485,8 @@ TEST_CASE("discrete_distribution") constexpr std::size_t count = 3; constexpr double xmin = 1, xmax = 3; - auto stl_dist = std::discrete_distribution(count, xmin, xmax, [](double val) { return val; }); - auto units_dist = units::discrete_distribution(count, xmin, xmax, [](double val) { return val; }); + auto stl_dist = std::discrete_distribution(count, xmin, xmax, [](double val) { return val; }); + auto units_dist = units::discrete_distribution(count, xmin, xmax, [](double val) { return val; }); CHECK(units_dist.probabilities() == stl_dist.probabilities()); } @@ -472,19 +494,19 @@ TEST_CASE("discrete_distribution") TEST_CASE("piecewise_constant_distribution") { - using Rep = long double; - using Qty = length; + using rep = long double; + using q = length; - std::vector intervals_rep_vec = {1.0, 2.0, 3.0}; - std::vector intervals_qty_vec = {1.0q_m, 2.0q_m, 3.0q_m}; + std::vector intervals_rep_vec = {1.0, 2.0, 3.0}; + std::vector intervals_qty_vec = {1.0q_m, 2.0q_m, 3.0q_m}; SECTION("default") { - auto stl_dist = std::piecewise_constant_distribution(); - auto units_dist = units::piecewise_constant_distribution(); + auto stl_dist = std::piecewise_constant_distribution(); + auto units_dist = units::piecewise_constant_distribution(); - CHECK(units_dist.min() == Qty(stl_dist.min())); - CHECK(units_dist.max() == Qty(stl_dist.max())); + CHECK(units_dist.min() == q(stl_dist.min())); + CHECK(units_dist.max() == q(stl_dist.max())); CHECK(stl_dist.intervals().size() == 2); CHECK(units_dist.intervals().size() == 2); CHECK(stl_dist.densities().size() == 1); @@ -492,12 +514,12 @@ TEST_CASE("piecewise_constant_distribution") } SECTION ("parametrized_input_it") { - constexpr std::array intervals_rep = {1.0, 2.0, 3.0}; - constexpr std::array intervals_qty = {1.0q_m, 2.0q_m, 3.0q_m}; - constexpr std::array weights = {1.0, 2.0, 3.0}; + constexpr std::array intervals_rep = {1.0, 2.0, 3.0}; + constexpr std::array intervals_qty = {1.0q_m, 2.0q_m, 3.0q_m}; + constexpr std::array weights = {1.0, 2.0, 3.0}; - auto stl_dist = std::piecewise_constant_distribution(intervals_rep.cbegin(), intervals_rep.cend(), weights.cbegin()); - auto units_dist = units::piecewise_constant_distribution(intervals_qty.cbegin(), intervals_qty.cend(), weights.cbegin()); + auto stl_dist = std::piecewise_constant_distribution(intervals_rep.cbegin(), intervals_rep.cend(), weights.cbegin()); + auto units_dist = units::piecewise_constant_distribution(intervals_qty.cbegin(), intervals_qty.cend(), weights.cbegin()); CHECK(stl_dist.intervals() == intervals_rep_vec); CHECK(units_dist.intervals() == intervals_qty_vec); @@ -505,11 +527,11 @@ TEST_CASE("piecewise_constant_distribution") } SECTION ("parametrized_initializer_list") { - std::initializer_list intervals_rep = {1.0, 2.0, 3.0}; - std::initializer_list intervals_qty = {1.0q_m, 2.0q_m, 3.0q_m}; + std::initializer_list intervals_rep = {1.0, 2.0, 3.0}; + std::initializer_list intervals_qty = {1.0q_m, 2.0q_m, 3.0q_m}; - auto stl_dist = std::piecewise_constant_distribution(intervals_rep, [](Rep val) { return val; }); - auto units_dist = units::piecewise_constant_distribution(intervals_qty, [](Qty qty) { return qty.count(); }); + auto stl_dist = std::piecewise_constant_distribution(intervals_rep, [](rep val) { return val; }); + auto units_dist = units::piecewise_constant_distribution(intervals_qty, [](q qty) { return qty.count(); }); CHECK(units_dist.intervals() == intervals_qty_vec); CHECK(units_dist.densities() == stl_dist.densities()); @@ -517,11 +539,11 @@ TEST_CASE("piecewise_constant_distribution") SECTION ("parametrized_range") { constexpr std::size_t nw = 2; - constexpr Rep xmin_rep = 1.0, xmax_rep = 3.0; - constexpr Qty xmin_qty = 1.0q_m, xmax_qty = 3.0q_m; + constexpr rep xmin_rep = 1.0, xmax_rep = 3.0; + constexpr q xmin_qty = 1.0q_m, xmax_qty = 3.0q_m; - auto stl_dist = std::piecewise_constant_distribution(nw, xmin_rep, xmax_rep, [](Rep val) { return val; }); - auto units_dist = units::piecewise_constant_distribution(nw, xmin_qty, xmax_qty, [](Qty qty) { return qty.count(); }); + auto stl_dist = std::piecewise_constant_distribution(nw, xmin_rep, xmax_rep, [](rep val) { return val; }); + auto units_dist = units::piecewise_constant_distribution(nw, xmin_qty, xmax_qty, [](q qty) { return qty.count(); }); CHECK(units_dist.intervals() == intervals_qty_vec); CHECK(units_dist.densities() == stl_dist.densities()); @@ -530,19 +552,19 @@ TEST_CASE("piecewise_constant_distribution") TEST_CASE("piecewise_linear_distribution") { - using Rep = long double; - using Qty = length; + using rep = long double; + using q = length; - std::vector intervals_rep_vec = {1.0, 2.0, 3.0}; - std::vector intervals_qty_vec = {1.0q_m, 2.0q_m, 3.0q_m}; + std::vector intervals_rep_vec = {1.0, 2.0, 3.0}; + std::vector intervals_qty_vec = {1.0q_m, 2.0q_m, 3.0q_m}; SECTION("default") { - auto stl_dist = std::piecewise_linear_distribution(); - auto units_dist = units::piecewise_linear_distribution(); + auto stl_dist = std::piecewise_linear_distribution(); + auto units_dist = units::piecewise_linear_distribution(); - CHECK(units_dist.min() == Qty(stl_dist.min())); - CHECK(units_dist.max() == Qty(stl_dist.max())); + CHECK(units_dist.min() == q(stl_dist.min())); + CHECK(units_dist.max() == q(stl_dist.max())); CHECK(stl_dist.intervals().size() == 2); CHECK(units_dist.intervals().size() == 2); CHECK(stl_dist.densities().size() == 2); @@ -550,12 +572,12 @@ TEST_CASE("piecewise_linear_distribution") } SECTION ("parametrized_input_it") { - constexpr std::array intervals_rep = {1.0, 2.0, 3.0}; - constexpr std::array intervals_qty = {1.0q_m, 2.0q_m, 3.0q_m}; - constexpr std::array weights = {1.0, 2.0, 3.0}; + constexpr std::array intervals_rep = {1.0, 2.0, 3.0}; + constexpr std::array intervals_qty = {1.0q_m, 2.0q_m, 3.0q_m}; + constexpr std::array weights = {1.0, 2.0, 3.0}; - auto stl_dist = std::piecewise_linear_distribution(intervals_rep.cbegin(), intervals_rep.cend(), weights.cbegin()); - auto units_dist = units::piecewise_linear_distribution(intervals_qty.cbegin(), intervals_qty.cend(), weights.cbegin()); + auto stl_dist = std::piecewise_linear_distribution(intervals_rep.cbegin(), intervals_rep.cend(), weights.cbegin()); + auto units_dist = units::piecewise_linear_distribution(intervals_qty.cbegin(), intervals_qty.cend(), weights.cbegin()); CHECK(stl_dist.intervals() == intervals_rep_vec); CHECK(units_dist.intervals() == intervals_qty_vec); @@ -563,11 +585,11 @@ TEST_CASE("piecewise_linear_distribution") } SECTION ("parametrized_initializer_list") { - std::initializer_list intervals_rep = {1.0, 2.0, 3.0}; - std::initializer_list intervals_qty = {1.0q_m, 2.0q_m, 3.0q_m}; + std::initializer_list intervals_rep = {1.0, 2.0, 3.0}; + std::initializer_list intervals_qty = {1.0q_m, 2.0q_m, 3.0q_m}; - auto stl_dist = std::piecewise_linear_distribution(intervals_rep, [](Rep val) { return val; }); - auto units_dist = units::piecewise_linear_distribution(intervals_qty, [](Qty qty) { return qty.count(); }); + auto stl_dist = std::piecewise_linear_distribution(intervals_rep, [](rep val) { return val; }); + auto units_dist = units::piecewise_linear_distribution(intervals_qty, [](q qty) { return qty.count(); }); CHECK(units_dist.intervals() == intervals_qty_vec); CHECK(units_dist.densities() == stl_dist.densities()); @@ -575,11 +597,11 @@ TEST_CASE("piecewise_linear_distribution") SECTION ("parametrized_range") { constexpr std::size_t nw = 2; - constexpr Rep xmin_rep = 1.0, xmax_rep = 3.0; - constexpr Qty xmin_qty = 1.0q_m, xmax_qty = 3.0q_m; + constexpr rep xmin_rep = 1.0, xmax_rep = 3.0; + constexpr q xmin_qty = 1.0q_m, xmax_qty = 3.0q_m; - auto stl_dist = std::piecewise_linear_distribution(nw, xmin_rep, xmax_rep, [](Rep val) { return val; }); - auto units_dist = units::piecewise_linear_distribution(nw, xmin_qty, xmax_qty, [](Qty qty) { return qty.count(); }); + auto stl_dist = std::piecewise_linear_distribution(nw, xmin_rep, xmax_rep, [](rep val) { return val; }); + auto units_dist = units::piecewise_linear_distribution(nw, xmin_qty, xmax_qty, [](q qty) { return qty.count(); }); CHECK(units_dist.intervals() == intervals_qty_vec); CHECK(units_dist.densities() == stl_dist.densities());