13#if !defined(ULTRA_FITNESS_H)
14# error "Don't include this file directly, include the specific .h instead"
17#if !defined(ULTRA_FITNESS_TCC)
18#define ULTRA_FITNESS_TCC
23inline constexpr fitnd::fitnd(std::initializer_list<double> l) : vect_(l)
28[[nodiscard]]
constexpr F lowest() noexcept
30 return std::numeric_limits<F>::lowest();
33template<std::
integral F>
34[[nodiscard]]
bool isfinite(F)
noexcept
39template<std::
floating_po
int F>
40[[nodiscard]]
bool isfinite(F f)
42 return std::isfinite(f);
49template<MultiDimFitness F>
50[[nodiscard]]
bool isfinite(
const F &f)
52 return std::ranges::all_of(f, [](
auto v) {
return isfinite(v); });
73requires std::is_arithmetic_v<F>
79template<MultiDimFitness F>
80[[nodiscard]]
bool dominating(
const F &lhs,
const F &rhs)
82 Expects(std::ranges::size(lhs) == std::ranges::size(rhs));
84 bool one_better(
false);
86 for (
auto [l, r] : std::views::zip(lhs, rhs))
95template<MultiDimFitness F>
96[[nodiscard]]
bool almost_equal(
const F &lhs,
const F &rhs)
98 return std::ranges::equal(
100 [](
auto v1,
auto v2) {
return almost_equal(v1, v2); });
116requires std::is_arithmetic_v<F>
119 if constexpr (std::floating_point<F>)
120 return std::fabs(f1 - f2);
127 using U = std::make_unsigned_t<F>;
129 return static_cast<double>(f1 >= f2 ? U(f1) - U(f2) : U(f2) - U(f1));
133template<MultiDimFitness F>
134[[nodiscard]]
double distance(
const F &f1,
const F &f2)
136 Expects(std::ranges::size(f1) == std::ranges::size(f2));
138 return std::transform_reduce(
139 std::ranges::begin(f1), std::ranges::end(f1), std::ranges::begin(f2), 0.0,
149requires std::floating_point<F>
150[[nodiscard]]
bool save(std::ostream &
out, F f)
152 save_float_to_stream(
out, f);
158template<std::
integral F>
159[[nodiscard]]
bool save(std::ostream &
out, F f)
166template<MultiDimFitness F>
167requires std::floating_point<std::ranges::range_value_t<F>>
168[[nodiscard]]
bool save(std::ostream &
out,
const F &f)
170 out << std::ranges::size(f);
175 save_float_to_stream(
out, v);
189template<std::
floating_po
int F>
190bool load(std::istream &in, F *f)
192 return load_float_from_stream(in, f);
195template<std::
integral F>
196bool load(std::istream &in, F *f)
bool dominating(const F &lhs, const F &rhs)
Definition fitness.tcc:74
double distance(F f1, F f2)
Definition fitness.tcc:117
bool load(std::istream &in, F *f)
Definition fitness.tcc:190
bool save(std::ostream &out, F f)
Definition fitness.tcc:150
double distance(F f1, F f2)
Definition fitness.h:118