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;
95 static bool is_pos_inf(
double t_value) {
96 return t_value >= Inf;
99 static bool is_neg_inf(
double t_value) {
100 return t_value <= -Inf;
103 static bool is_inf(
double t_value) {
104 return is_pos_inf(t_value) || is_neg_inf(t_value);
107 static bool equals(
double t_a,
double t_b,
double t_tolerance) {
108 return std::abs(t_a - t_b) <= t_tolerance;
111 static bool is(
double t_a, CtrType t_type,
double t_b,
double t_tolerance) {
115 return t_a <= t_b + t_tolerance;
117 return t_a >= t_b - t_tolerance;
119 return equals(t_a, t_b, t_tolerance);
123 throw Exception(
"Enum out of bounds.");
126 static double relative_gap(
double t_lb,
double t_ub) {
128 if (is_neg_inf(t_lb) || is_pos_inf(t_ub)) {
132 return std::abs(t_lb - t_ub) / (1e-10 + std::abs(t_ub));
135 static double absolute_gap(
double t_lb,
double t_ub) {
136 if (is_pos_inf(t_ub) || is_neg_inf(t_lb)) {
139 return std::abs(t_ub - t_lb);
142 static bool is_zero(
double t_value,
double t_tolerance) {
143 return std::abs(t_value) <= t_tolerance;
147 decltype(std::declval<T>().is_zero(.1)) is_zero(
const T& t_expr,
double t_tolerance) {
148 return t_expr.is_zero(t_tolerance);
151 static bool is_integer(
double t_value,
double t_tolerance) {
152 return std::abs(t_value - std::round(t_value)) <= t_tolerance;
155 static double round(
double t_value,
unsigned int t_n_digits = 0) {
156 const double multiplier = std::pow(10, t_n_digits);
157 return std::round(t_value * multiplier) / multiplier;
static double Feasibility
static double MIPAbsoluteGap
static double MIPRelativeGap