35#define _USE_MATH_DEFINES
50#if defined(__INTEL_COMPILER) || defined(_MSC_VER)
51#pragma fenv_access (on)
52#elif defined(__GNUC__) && !defined(__clang__)
53#pragma STDC FENV_ACCESS ON
63#if defined(__GNUC__) && !defined(__INTEL_COMPILER)
65#pragma clang optimize off
67#pragma GCC optimize ("O0")
74#ifdef SCIP_ROUNDING_FE
83#define SCIP_ROUND_DOWNWARDS FE_DOWNWARD
84#define SCIP_ROUND_UPWARDS FE_UPWARD
85#define SCIP_ROUND_NEAREST FE_TONEAREST
86#define SCIP_ROUND_ZERO FE_TOWARDZERO
126#ifdef SCIP_ROUNDING_FP
135#define SCIP_ROUND_DOWNWARDS FP_RND_RM
136#define SCIP_ROUND_UPWARDS FP_RND_RP
137#define SCIP_ROUND_NEAREST FP_RND_RN
138#define SCIP_ROUND_ZERO FP_RND_RZ
178#ifdef SCIP_ROUNDING_MS
187#define SCIP_ROUND_DOWNWARDS RC_DOWN
188#define SCIP_ROUND_UPWARDS RC_UP
189#define SCIP_ROUND_NEAREST RC_NEAR
190#define SCIP_ROUND_ZERO RC_CHOP
233#define SCIP_ROUND_DOWNWARDS 0
234#define SCIP_ROUND_UPWARDS 1
235#define SCIP_ROUND_NEAREST 2
236#define SCIP_ROUND_ZERO 3
252 SCIPerrorMessage(
"setting rounding mode not available - interval arithmetic is invalid!\n");
283#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
297 __asm volatile (
"fldl %1; fchs; fstpl %0" :
"=m" (
x) :
"m" (
x));
304#elif defined(_MSC_VER) && (defined(__INTEL_COMPILER) || !defined(_M_X64))
393#undef SCIPintervalGetInf
394#undef SCIPintervalGetSup
395#undef SCIPintervalSet
396#undef SCIPintervalSetBounds
397#undef SCIPintervalSetEmpty
398#undef SCIPintervalIsEmpty
399#undef SCIPintervalSetEntire
400#undef SCIPintervalIsEntire
401#undef SCIPintervalIsPositiveInfinity
402#undef SCIPintervalIsNegativeInfinity
782 for(
i = 0;
i < length; ++
i )
788 for(
i = 0;
i < length; ++
i )
2167 if( exponent == 0.0 )
2170 if( image.
inf <= 1.0 && image.
sup >= 1.0 )
2175 else if( image.
inf <= 0.0 && image.
sup >= 0.0 )
2199 if( image.
sup >= 0.0 )
2217 if( image.
inf < 0.0 &&
basedomain.inf < 0.0 &&
EPSISINT(exponent, 0.0) && ((
int)exponent % 2 != 0) )
2692static const double pi_d_l = (3373259426.0 + 273688.0 / (1<<21)) / (1<<30);
2693static const double pi_d_u = (3373259426.0 + 273689.0 / (1<<21)) / (1<<30);
2695#define pi_d_l ((3373259426.0 + 273688.0 / (1<<21)) / (1<<30))
2696#define pi_d_u ((3373259426.0 + 273689.0 / (1<<21)) / (1<<30))
2856 if( (
int)
k % 2 != 0 )
3066 if( t >
x.inf &&
negate(2*
a)*
x.sup >
b && s*t >
u )
3245 if(
lincoeff >= 0.0 && rhs <= 0.0 )
3437 SCIPdebugMessage(
"solving [%g,%g]*x = [%g,%g] for x in [%g,%g] gives [%g,%g]\n",
lincoeff.inf,
lincoeff.sup, rhs.
inf, rhs.
sup,
xbnds.inf,
xbnds.sup,
resultant->inf,
resultant->sup);
3441 SCIPdebugMessage(
"solving [%g,%g]*x^2 + [%g,%g]*x = [%g,%g] for x in [%g,%g]\n",
sqrcoeff.inf,
sqrcoeff.sup,
lincoeff.inf,
lincoeff.sup, rhs.
inf, rhs.
sup,
xbnds.inf,
xbnds.sup);
3444 if(
xbnds.sup >= 0 )
3447 SCIPdebugMessage(
" solutions of [%g,%g]*x^2 + [%g,%g]*x in [%g,%g] for x in [%g,%g] are [%.15g,%.15g]\n",
3448 sqrcoeff.inf,
sqrcoeff.sup,
lincoeff.inf,
lincoeff.sup, rhs.
inf, rhs.
sup,
MAX(
xbnds.inf, 0.0),
xbnds.sup,
xpos.inf,
xpos.sup);
3456 if(
xbnds.inf <= 0.0 )
3459 SCIPdebugMessage(
" solutions of [%g,%g]*x^2 + [%g,%g]*x in [%g,%g] for x in [%g,%g] are [%g,%g]\n",
3460 sqrcoeff.inf,
sqrcoeff.sup,
lincoeff.inf,
lincoeff.sup, rhs.
inf, rhs.
sup,
xbnds.inf,
MIN(
xbnds.sup, 0.0),
xneg.inf,
xneg.sup);
3532 minval =
MIN(val, minval);
3533 maxval =
MAX(val, maxval);
3545 minval =
MIN(val, minval);
3546 maxval =
MAX(val, maxval);
3559 else if(
ax == 0.0 )
3569 minval =
MIN(val, minval);
3570 maxval =
MAX(val, maxval);
3578 minval =
MIN(val, minval);
3579 maxval =
MAX(val, maxval);
3591 minval =
MIN(
tmp.inf, minval);
3592 maxval =
MAX(
tmp.sup, maxval);
3602 else if(
ax == 0.0 )
3612 minval =
MIN(val, minval);
3613 maxval =
MAX(val, maxval);
3621 minval =
MIN(val, minval);
3622 maxval =
MAX(val, maxval);
3634 minval =
MIN(
tmp.inf, minval);
3635 maxval =
MAX(
tmp.sup, maxval);
3645 else if(
ay == 0.0 )
3655 minval =
MIN(val, minval);
3656 maxval =
MAX(val, maxval);
3664 minval =
MIN(val, minval);
3665 maxval =
MAX(val, maxval);
3677 minval =
MIN(
tmp.inf, minval);
3678 maxval =
MAX(
tmp.sup, maxval);
3688 else if(
ay == 0.0 )
3698 minval =
MIN(val, minval);
3699 maxval =
MAX(val, maxval);
3707 minval =
MIN(val, minval);
3708 maxval =
MAX(val, maxval);
3720 minval =
MIN(
tmp.inf, minval);
3721 maxval =
MAX(
tmp.sup, maxval);
3728 SCIPdebugMessage(
"range for %gx^2 + %gy^2 + %gxy + %gx + %gy = [%g, %g] for x = [%g, %g], y=[%g, %g]\n",
3729 ax,
ay,
axy,
bx,
by, minval, maxval,
xbnds.inf,
xbnds.sup,
ybnds.inf,
ybnds.sup);
3773 if(
xbnds.sup >= 0.0 )
3782 if(
xbnds.inf < 0.0 )
3868#define CALCB(y) ((bx + axy * (y)) / (2.0 * sqrtax))
3869#define CALCR(c,y) (rcoef_const + (c) + (rcoef_y + rcoef_yy * (y)) * (y))
3880 if(
EPSN(ub, 1
e-9) )
4258 if(
ybnds.sup >= 0.0 )
4301 if(
ybnds.inf < 0.0 )
4428 if( lincoef.
inf == 0.0 && lincoef.
sup == 0.0 )
4436 else if(
xbnds.inf >= 0.0 )
4479 else if(
ay *
axy < 0.0 )
4485 minval =
MIN(val, minval);
4493 else if(
ay *
axy > 0.0 )
4499 minval =
MIN(val, minval);
4515 minval =
MIN(val, minval);
4526 minval =
MIN(val, minval);
4549 else if(
ay *
axy > 0.0 )
4555 maxval =
MAX(val, maxval);
4563 else if(
ay *
axy < 0.0 )
4569 maxval =
MAX(val, maxval);
4584 maxval =
MAX(val, maxval);
4594 maxval =
MAX(val, maxval);
4633 SCIP_Bool* infeasible
4642 int nreductions = 0;
4651 *infeasible =
FALSE;
common defines and data types used in all packages of SCIP
SCIP_Real SCIPnextafter(SCIP_Real from, SCIP_Real to)
SCIP_Real SCIPrelDiff(SCIP_Real val1, SCIP_Real val2)
void SCIPintervalMulSup(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand1, SCIP_INTERVAL operand2)
void SCIPintervalSetRoundingModeUpwards(void)
void SCIPintervalIntersectEps(SCIP_INTERVAL *resultant, SCIP_Real eps, SCIP_INTERVAL operand1, SCIP_INTERVAL operand2)
void SCIPintervalAddSup(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand1, SCIP_INTERVAL operand2)
void SCIPintervalMulScalarInf(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand1, SCIP_Real operand2)
void SCIPintervalSetRoundingModeDownwards(void)
SCIP_Real SCIPintervalGetInf(SCIP_INTERVAL interval)
SCIP_Real SCIPintervalQuadUpperBound(SCIP_Real infinity, SCIP_Real a, SCIP_INTERVAL b_, SCIP_INTERVAL x)
SCIP_Bool SCIPintervalIsEntire(SCIP_Real infinity, SCIP_INTERVAL operand)
void SCIPintervalScalprodScalarsInf(SCIP_Real infinity, SCIP_INTERVAL *resultant, int length, SCIP_INTERVAL *operand1, SCIP_Real *operand2)
void SCIPintervalSub(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand1, SCIP_INTERVAL operand2)
void SCIPintervalSetEntire(SCIP_Real infinity, SCIP_INTERVAL *resultant)
SCIP_Bool SCIPintervalIsPositiveInfinity(SCIP_Real infinity, SCIP_INTERVAL operand)
SCIP_Real SCIPintervalPowerScalarIntegerSup(SCIP_Real operand1, int operand2)
void SCIPintervalSquareRoot(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand)
void SCIPintervalMulInf(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand1, SCIP_INTERVAL operand2)
void SCIPintervalScalprodScalarsSup(SCIP_Real infinity, SCIP_INTERVAL *resultant, int length, SCIP_INTERVAL *operand1, SCIP_Real *operand2)
SCIP_ROUNDMODE SCIPintervalGetRoundingMode(void)
void SCIPintervalSetRoundingModeToNearest(void)
void SCIPintervalPower(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand1, SCIP_INTERVAL operand2)
void SCIPintervalSolveUnivariateQuadExpression(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL sqrcoeff, SCIP_INTERVAL lincoeff, SCIP_INTERVAL rhs, SCIP_INTERVAL xbnds)
void SCIPintervalSignPowerScalar(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand1, SCIP_Real operand2)
SCIP_Real SCIPintervalPowerScalarIntegerInf(SCIP_Real operand1, int operand2)
void SCIPintervalSetRoundingMode(SCIP_ROUNDMODE roundmode)
void SCIPintervalScalprodScalars(SCIP_Real infinity, SCIP_INTERVAL *resultant, int length, SCIP_INTERVAL *operand1, SCIP_Real *operand2)
void SCIPintervalUnify(SCIP_INTERVAL *resultant, SCIP_INTERVAL operand1, SCIP_INTERVAL operand2)
void SCIPintervalAbs(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand)
void SCIPintervalSubScalar(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand1, SCIP_Real operand2)
void SCIPintervalSetRoundingModeTowardsZero(void)
void SCIPintervalCos(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand)
void SCIPintervalSolveBivariateQuadExpressionAllScalar(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_Real ax, SCIP_Real ay, SCIP_Real axy, SCIP_Real bx, SCIP_Real by, SCIP_INTERVAL rhs, SCIP_INTERVAL xbnds, SCIP_INTERVAL ybnds)
void SCIPintervalMax(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand1, SCIP_INTERVAL operand2)
void SCIPintervalIntersect(SCIP_INTERVAL *resultant, SCIP_INTERVAL operand1, SCIP_INTERVAL operand2)
void SCIPintervalSquare(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand)
void SCIPintervalSet(SCIP_INTERVAL *resultant, SCIP_Real value)
SCIP_Bool SCIPintervalIsSubsetEQ(SCIP_Real infinity, SCIP_INTERVAL operand1, SCIP_INTERVAL operand2)
SCIP_Bool SCIPintervalIsEmpty(SCIP_Real infinity, SCIP_INTERVAL operand)
void SCIPintervalPowerScalarInverse(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL basedomain, SCIP_Real exponent, SCIP_INTERVAL image)
SCIP_Bool SCIPintervalHasRoundingControl(void)
void SCIPintervalSin(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand)
void SCIPintervalSolveUnivariateQuadExpressionPositive(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL sqrcoeff, SCIP_INTERVAL lincoeff, SCIP_INTERVAL rhs, SCIP_INTERVAL xbnds)
void SCIPintervalSetBounds(SCIP_INTERVAL *resultant, SCIP_Real inf, SCIP_Real sup)
void SCIPintervalAddInf(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand1, SCIP_INTERVAL operand2)
void SCIPintervalMin(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand1, SCIP_INTERVAL operand2)
void SCIPintervalAddVectors(SCIP_Real infinity, SCIP_INTERVAL *resultant, int length, SCIP_INTERVAL *operand1, SCIP_INTERVAL *operand2)
SCIP_Bool SCIPintervalIsNegativeInfinity(SCIP_Real infinity, SCIP_INTERVAL operand)
void SCIPintervalMulScalar(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand1, SCIP_Real operand2)
void SCIPintervalReciprocal(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand)
void SCIPintervalPowerScalarInteger(SCIP_INTERVAL *resultant, SCIP_Real operand1, int operand2)
void SCIPintervalEntropy(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand)
void SCIPintervalMul(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand1, SCIP_INTERVAL operand2)
void SCIPintervalDiv(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand1, SCIP_INTERVAL operand2)
void SCIPintervalPowerScalarScalar(SCIP_INTERVAL *resultant, SCIP_Real operand1, SCIP_Real operand2)
void SCIPintervalQuad(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_Real sqrcoeff, SCIP_INTERVAL lincoeff, SCIP_INTERVAL xrng)
void SCIPintervalSign(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand)
void SCIPintervalPowerScalar(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand1, SCIP_Real operand2)
void SCIPintervalLog(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand)
void SCIPintervalAddScalar(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand1, SCIP_Real operand2)
void SCIPintervalMulScalarSup(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand1, SCIP_Real operand2)
void SCIPintervalDivScalar(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand1, SCIP_Real operand2)
SCIP_Bool SCIPintervalAreDisjointEps(SCIP_Real eps, SCIP_INTERVAL operand1, SCIP_INTERVAL operand2)
void SCIPintervalSolveUnivariateQuadExpressionNegative(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL sqrcoeff, SCIP_INTERVAL lincoeff, SCIP_INTERVAL rhs, SCIP_INTERVAL xbnds)
SCIP_Real SCIPintervalGetSup(SCIP_INTERVAL interval)
void SCIPintervalSolveUnivariateQuadExpressionPositiveAllScalar(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_Real sqrcoeff, SCIP_Real lincoeff, SCIP_Real rhs, SCIP_INTERVAL xbnds)
void SCIPintervalQuadBivar(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_Real ax, SCIP_Real ay, SCIP_Real axy, SCIP_Real bx, SCIP_Real by, SCIP_INTERVAL xbnds, SCIP_INTERVAL ybnds)
SCIP_Real SCIPintervalNegateReal(SCIP_Real x)
SCIP_Bool SCIPintervalAreDisjoint(SCIP_INTERVAL operand1, SCIP_INTERVAL operand2)
int SCIPintervalPropagateWeightedSum(SCIP_Real infinity, int noperands, SCIP_INTERVAL *operands, SCIP_Real *weights, SCIP_Real constant, SCIP_INTERVAL rhs, SCIP_INTERVAL *resultants, SCIP_Bool *infeasible)
void SCIPintervalExp(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand)
void SCIPintervalAdd(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand1, SCIP_INTERVAL operand2)
void SCIPintervalScalprod(SCIP_Real infinity, SCIP_INTERVAL *resultant, int length, SCIP_INTERVAL *operand1, SCIP_INTERVAL *operand2)
void SCIPintervalSetEmpty(SCIP_INTERVAL *resultant)
assert(minobj< SCIPgetCutoffbound(scip))
static const double pi_d_l
#define SCIP_ROUND_NEAREST
static SCIP_Real negate(SCIP_Real x)
static SCIP_ROUNDMODE intervalGetRoundingMode(void)
#define SCIP_ROUND_UPWARDS
static const double pi_d_u
#define SCIP_ROUND_DOWNWARDS
static void intervalSetRoundingMode(SCIP_ROUNDMODE roundmode)
interval arithmetics for provable bounds
#define BMScopyMemoryArray(ptr, source, num)
SCIP_Real SCIPnegateReal(SCIP_Real x)
internal miscellaneous methods
public methods for message output