5#ifndef OPTIMIZE_NUMERICALS_H
6#define OPTIMIZE_NUMERICALS_H
13#include <idol/mixed-integer/modeling/Types.h>
17 static constexpr double Inf = 1e20;
39 static unsigned int Digits = 8;
43 static bool is_pos_inf(
double t_value) {
44 return t_value >= Inf;
47 static bool is_neg_inf(
double t_value) {
48 return t_value <= -Inf;
51 static bool is_inf(
double t_value) {
52 return is_pos_inf(t_value) || is_neg_inf(t_value);
55 static bool equals(
double t_a,
double t_b,
double t_tolerance) {
56 return std::abs(t_a - t_b) <= t_tolerance;
59 static bool is(
double t_a, CtrType t_type,
double t_b,
double t_tolerance) {
63 return t_a <= t_b + t_tolerance;
65 return t_a >= t_b - t_tolerance;
67 return equals(t_a, t_b, t_tolerance);
74 static double relative_gap(
double t_lb,
double t_ub) {
76 if (is_neg_inf(t_lb) || is_pos_inf(t_ub)) {
80 return std::abs(t_lb - t_ub) / (1e-10 + std::abs(t_ub));
83 static double absolute_gap(
double t_lb,
double t_ub) {
84 if (is_pos_inf(t_ub) || is_neg_inf(t_lb)) {
87 return std::abs(t_ub - t_lb);
90 static bool is_zero(
double t_value,
double t_tolerance) {
91 return std::abs(t_value) <= t_tolerance;
95 decltype(std::declval<T>().is_zero(.1)) is_zero(
const T& t_expr,
double t_tolerance) {
96 return t_expr.is_zero(t_tolerance);
99 static bool is_integer(
double t_value,
double t_tolerance) {
100 return std::abs(t_value - std::round(t_value)) <= t_tolerance;
103 static double round(
double t_value,
unsigned int t_n_digits = 0) {
104 const double multiplier = std::pow(10, t_n_digits);
105 return std::round(t_value * multiplier) / multiplier;