SCIP Doxygen Documentation
Loading...
Searching...
No Matches
expr_exp.c
Go to the documentation of this file.
1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2/* */
3/* This file is part of the program and library */
4/* SCIP --- Solving Constraint Integer Programs */
5/* */
6/* Copyright (c) 2002-2026 Zuse Institute Berlin (ZIB) */
7/* */
8/* Licensed under the Apache License, Version 2.0 (the "License"); */
9/* you may not use this file except in compliance with the License. */
10/* You may obtain a copy of the License at */
11/* */
12/* http://www.apache.org/licenses/LICENSE-2.0 */
13/* */
14/* Unless required by applicable law or agreed to in writing, software */
15/* distributed under the License is distributed on an "AS IS" BASIS, */
16/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
17/* See the License for the specific language governing permissions and */
18/* limitations under the License. */
19/* */
20/* You should have received a copy of the Apache-2.0 license */
21/* along with SCIP; see the file LICENSE. If not visit scipopt.org. */
22/* */
23/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
24
25/**@file expr_exp.c
26 * @ingroup DEFPLUGINS_EXPR
27 * @brief exponential expression handler
28 * @author Stefan Vigerske
29 * @author Benjamin Mueller
30 * @author Ksenia Bestuzheva
31 */
32
33/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
34
35#define _USE_MATH_DEFINES /* to get M_E on Windows */ /*lint !750 */
36
37#include <math.h>
38
39#include "scip/expr_exp.h"
40#include "scip/expr_value.h"
41
42#define EXPRHDLR_NAME "exp"
43#define EXPRHDLR_DESC "exponential expression"
44#define EXPRHDLR_PRECEDENCE 85000
45#define EXPRHDLR_HASHKEY SCIPcalcFibHash(10181.0)
46
47/*
48 * Data structures
49 */
50
51/*
52 * Local methods
53 */
54
55/** computes coefficients of secant of an exponential term */
56static
58 SCIP* scip, /**< SCIP data structure */
59 SCIP_Real lb, /**< lower bound on variable */
60 SCIP_Real ub, /**< upper bound on variable */
61 SCIP_Real* lincoef, /**< buffer to add coefficient of secant */
62 SCIP_Real* linconstant, /**< buffer to add constant of secant */
63 SCIP_Bool* success /**< buffer to set to FALSE if secant has failed due to large numbers or unboundedness */
64 )
65{
66 SCIP_Real coef;
67 SCIP_Real constant;
68
69 assert(scip != NULL);
72 assert(SCIPisLE(scip, lb, ub));
73 assert(lincoef != NULL);
74 assert(linconstant != NULL);
75 assert(success != NULL);
76
77 if( SCIPisInfinity(scip, -lb) || SCIPisInfinity(scip, ub) )
78 {
79 /* unboundedness */
80 *success = FALSE;
81 return;
82 }
83
84 /* if lb and ub are too close use a safe secant */
85 if( SCIPisEQ(scip, lb, ub) )
86 {
87 coef = 0.0;
88 constant = exp(ub);
89 }
90 else
91 {
92 coef = (exp(ub) - exp(lb)) / (ub - lb);
93 constant = exp(ub) - coef * ub;
94 }
95
96 if( SCIPisInfinity(scip, REALABS(coef)) || SCIPisInfinity(scip, REALABS(constant)) )
97 {
98 *success = FALSE;
99 return;
100 }
101
102 *lincoef += coef;
103 *linconstant += constant;
104}
105
106/** computes coefficients of linearization of an exponential term in a reference point */
107static
109 SCIP* scip, /**< SCIP data structure */
110 SCIP_Real refpoint, /**< point for which to compute value of linearization */
111 SCIP_Bool isint, /**< whether corresponding variable is a discrete variable, and thus linearization could be moved */
112 SCIP_Real* lincoef, /**< buffer to add coefficient of secant */
113 SCIP_Real* linconstant, /**< buffer to add constant of secant */
114 SCIP_Bool* success /**< buffer to set to FALSE if secant has failed due to large numbers or unboundedness */
115 )
116{
117 SCIP_Real constant;
118 SCIP_Real coef;
119
120 assert(scip != NULL);
121 assert(lincoef != NULL);
122 assert(linconstant != NULL);
123 assert(success != NULL);
124
125 if( SCIPisInfinity(scip, REALABS(refpoint)) )
126 {
127 *success = FALSE;
128 return;
129 }
130
131 if( !isint || SCIPisIntegral(scip, refpoint) )
132 {
133 coef = exp(refpoint);
134 constant = exp(refpoint) * (1.0 - refpoint);
135 }
136 else
137 {
138 /* exp(x) -> secant between f=floor(refpoint) and f+1 = ((e-1)*e^f) * x + e^f - f * ((e-1)*e^f) */
139 SCIP_Real f;
140
141 f = SCIPfloor(scip, refpoint);
142
143 coef = (M_E - 1.0) * exp(f);
144 constant = exp(f) - f * coef;
145 }
146
147 if( SCIPisInfinity(scip, REALABS(coef)) || SCIPisInfinity(scip, REALABS(constant)) )
148 {
149 *success = FALSE;
150 return;
151 }
152
153 *lincoef += coef;
154 *linconstant += constant;
155}
156
157/*
158 * Callback methods of expression handler
159 */
160
161/** simplifies an exp expression
162 *
163 * Evaluates the exponential function when its child is a value expression.
164 *
165 * TODO: exp(log(*)) = *
166 */
167static
169{
170 SCIP_EXPR* child;
171
172 assert(scip != NULL);
173 assert(expr != NULL);
174 assert(simplifiedexpr != NULL);
175 assert(SCIPexprGetNChildren(expr) == 1);
176
177 child = SCIPexprGetChildren(expr)[0];
178 assert(child != NULL);
179
180 /**! [SnippetExprSimplifyExp] */
181 /* check for value expression */
182 if( SCIPisExprValue(scip, child) )
183 {
184 SCIP_CALL( SCIPcreateExprValue(scip, simplifiedexpr, exp(SCIPgetValueExprValue(child)), ownercreate, ownercreatedata) );
185 }
186 else
187 {
188 *simplifiedexpr = expr;
189
190 /* we have to capture it, since it must simulate a "normal" simplified call in which a new expression is created */
191 SCIPcaptureExpr(*simplifiedexpr);
192 }
193 /**! [SnippetExprSimplifyExp] */
194
195 return SCIP_OKAY;
196}
197
198/** expression handler copy callback */
199static
201{ /*lint --e{715}*/
203
204 return SCIP_OKAY;
205}
206
207/** expression data copy callback */
208static
210{ /*lint --e{715}*/
211 assert(targetexprdata != NULL);
212 assert(sourceexpr != NULL);
213 assert(SCIPexprGetData(sourceexpr) == NULL);
214
215 *targetexprdata = NULL;
216
217 return SCIP_OKAY;
218}
219
220/** expression data free callback */
221static
223{ /*lint --e{715}*/
224 assert(expr != NULL);
225
226 SCIPexprSetData(expr, NULL);
227
228 return SCIP_OKAY;
229}
230
231/** expression parse callback */
232static
234{ /*lint --e{715}*/
235 SCIP_EXPR* childexpr;
236
237 assert(expr != NULL);
238
239 /**! [SnippetExprParseExp] */
240 /* parse child expression from remaining string */
241 SCIP_CALL( SCIPparseExpr(scip, &childexpr, string, endstring, ownercreate, ownercreatedata) );
242 assert(childexpr != NULL);
243
244 /* create exponential expression */
245 SCIP_CALL( SCIPcreateExprExp(scip, expr, childexpr, ownercreate, ownercreatedata) );
246 assert(*expr != NULL);
247
248 /* release child expression since it has been captured by the exponential expression */
249 SCIP_CALL( SCIPreleaseExpr(scip, &childexpr) );
250
251 *success = TRUE;
252 /**! [SnippetExprParseExp] */
253
254 return SCIP_OKAY;
255}
256
257/** expression point evaluation callback */
258static
260{ /*lint --e{715}*/
261 assert(expr != NULL);
262 assert(SCIPexprGetData(expr) == NULL);
263 assert(SCIPexprGetNChildren(expr) == 1);
264 assert(SCIPexprGetEvalValue(SCIPexprGetChildren(expr)[0]) != SCIP_INVALID); /*lint !e777*/
265
266 *val = exp(SCIPexprGetEvalValue(SCIPexprGetChildren(expr)[0]));
267
268 return SCIP_OKAY;
269}
270
271/** expression derivative evaluation callback */
272static
274{ /*lint --e{715}*/
275 assert(expr != NULL);
276 assert(childidx == 0);
278 assert(SCIPexprGetEvalValue(expr) != SCIP_INVALID); /*lint !e777*/
279
280 *val = SCIPexprGetEvalValue(expr);
281
282 return SCIP_OKAY;
283}
284
285/** expression interval evaluation callback */
286static
288{ /*lint --e{715}*/
289 SCIP_INTERVAL childinterval;
290
291 assert(expr != NULL);
292 assert(SCIPexprGetData(expr) == NULL);
293 assert(SCIPexprGetNChildren(expr) == 1);
294
295 childinterval = SCIPexprGetActivity(SCIPexprGetChildren(expr)[0]);
296
297 if( SCIPintervalIsEmpty(SCIP_INTERVAL_INFINITY, childinterval) )
298 SCIPintervalSetEmpty(interval);
299 else
300 SCIPintervalExp(SCIP_INTERVAL_INFINITY, interval, childinterval);
301
302 return SCIP_OKAY;
303}
304
305/** expression estimator callback */
306static
308{ /*lint --e{715}*/
309 assert(scip != NULL);
310 assert(expr != NULL);
311 assert(SCIPexprGetNChildren(expr) == 1);
312 assert(coefs != NULL);
313 assert(constant != NULL);
314 assert(islocal != NULL);
315 assert(branchcand != NULL);
316 assert(*branchcand == TRUE);
317 assert(success != NULL);
318
320
321 *success = TRUE;
322 *coefs = 0.0;
323 *constant = 0.0;
324
325 if( overestimate )
326 {
327 addExpSecant(scip, localbounds[0].inf, localbounds[0].sup, coefs, constant, success);
328 *islocal = TRUE; /* secants are only valid locally */
329 }
330 else
331 {
332 addExpLinearization(scip, refpoint[0], SCIPexprIsIntegral(SCIPexprGetChildren(expr)[0]), coefs, constant, success);
333 *islocal = FALSE; /* linearization are globally valid */
334 *branchcand = FALSE;
335 }
336
337 return SCIP_OKAY;
338}
339
340/** initital estimates callback for an exponential expression */
341static
343{
344 SCIP_Real refpointsunder[3] = {SCIP_INVALID, SCIP_INVALID, SCIP_INVALID};
345 SCIP_Bool overest[4] = {FALSE, FALSE, FALSE, TRUE};
346 SCIP_EXPR* child;
347 SCIP_Real lb;
348 SCIP_Real ub;
349 SCIP_Bool success;
350 int i;
351
352 assert(scip != NULL);
353 assert(expr != NULL);
354 assert(SCIPexprGetNChildren(expr) == 1);
355
357
358 /* get expression data */
359 child = SCIPexprGetChildren(expr)[0];
360 assert(child != NULL);
361
362 lb = bounds[0].inf;
363 ub = bounds[0].sup;
364
365 if( !overestimate )
366 {
367 SCIP_Real lbfinite;
368 SCIP_Real ubfinite;
369
370 /* make bounds finite */
371 lbfinite = SCIPisInfinity(scip, -lb) ? MIN(-5.0, ub - 0.1 * REALABS(ub)) : lb; /*lint !e666*/
372 ubfinite = SCIPisInfinity(scip, ub) ? MAX( 3.0, lb + 0.1 * REALABS(lb)) : ub; /*lint !e666*/
373
374 refpointsunder[0] = (7.0 * lbfinite + ubfinite) / 8.0;
375 refpointsunder[1] = (lbfinite + ubfinite) / 2.0;
376 refpointsunder[2] = (lbfinite + 7.0 * ubfinite) / 8.0;
377 }
378
379 *nreturned = 0;
380 for( i = 0; i < 4; ++i )
381 {
382 if( !overest[i] && overestimate )
383 continue;
384
385 if( overest[i] && (!overestimate || SCIPisInfinity(scip, ub) || SCIPisInfinity(scip, -lb)) )
386 continue;
387
388 assert(overest[i] || (SCIPisLE(scip, refpointsunder[i], ub) && SCIPisGE(scip, refpointsunder[i], lb))); /*lint !e661*/
389
390 coefs[*nreturned][0] = 0.0;
391 constant[*nreturned] = 0.0;
392
393 success = TRUE;
394
395 if( !overest[i] )
396 {
397 assert(i < 3);
398 /* coverity[overrun] */
399 addExpLinearization(scip, refpointsunder[i], SCIPexprIsIntegral(child), coefs[*nreturned], &constant[*nreturned], &success); /*lint !e661*/
400 }
401 else
402 addExpSecant(scip, lb, ub, coefs[*nreturned], &constant[*nreturned], &success);
403
404 if( success )
405 ++*nreturned;
406 }
407
408 return SCIP_OKAY;
409}
410
411/** expression reverse propagation callback */
412static
414{ /*lint --e{715}*/
415 assert(scip != NULL);
416 assert(expr != NULL);
417 assert(SCIPexprGetNChildren(expr) == 1);
418 assert(SCIPintervalGetInf(bounds) >= 0.0);
419
420 if( SCIPintervalGetSup(bounds) <= 0.0 )
421 {
422 *infeasible = TRUE;
423 return SCIP_OKAY;
424 }
425
426 /* f = exp(c0) -> c0 = log(f) */
427 SCIPintervalLog(SCIP_INTERVAL_INFINITY, childrenbounds, bounds);
428
429 return SCIP_OKAY;
430}
431
432/** expression hash callback */
433static
435{ /*lint --e{715}*/
436 assert(scip != NULL);
437 assert(expr != NULL);
438 assert(SCIPexprGetNChildren(expr) == 1);
439 assert(hashkey != NULL);
440 assert(childrenhashes != NULL);
441
442 *hashkey = EXPRHDLR_HASHKEY;
443 *hashkey ^= childrenhashes[0];
444
445 return SCIP_OKAY;
446}
447
448/** expression curvature detection callback */
449static
451{ /*lint --e{715}*/
452 assert(scip != NULL);
453 assert(expr != NULL);
454 assert(childcurv != NULL);
455 assert(success != NULL);
456 assert(SCIPexprGetNChildren(expr) == 1);
457
458 /* expression is convex if child is convex; expression cannot be concave or linear */
459 if( exprcurvature == SCIP_EXPRCURV_CONVEX )
460 {
461 *success = TRUE;
462 *childcurv = SCIP_EXPRCURV_CONVEX;
463 }
464 else
465 *success = FALSE;
466
467 return SCIP_OKAY;
468}
469
470/** expression monotonicity detection callback */
471static
473{ /*lint --e{715}*/
474 assert(scip != NULL);
475 assert(expr != NULL);
476 assert(result != NULL);
477 assert(childidx == 0);
478
480
481 return SCIP_OKAY;
482}
483
484/** creates the handler for exponential expressions and includes it into SCIP */
486 SCIP* scip /**< SCIP data structure */
487 )
488{
489 SCIP_EXPRHDLR* exprhdlr;
490
492 EXPRHDLR_PRECEDENCE, evalExp, NULL) );
493 assert(exprhdlr != NULL);
494
495 SCIPexprhdlrSetCopyFreeHdlr(exprhdlr, copyhdlrExp, NULL);
496 SCIPexprhdlrSetCopyFreeData(exprhdlr, copydataExp, freedataExp);
497 SCIPexprhdlrSetSimplify(exprhdlr, simplifyExp);
498 SCIPexprhdlrSetParse(exprhdlr, parseExp);
499 SCIPexprhdlrSetIntEval(exprhdlr, intevalExp);
500 SCIPexprhdlrSetEstimate(exprhdlr, initestimatesExp, estimateExp);
501 SCIPexprhdlrSetReverseProp(exprhdlr, reversepropExp);
502 SCIPexprhdlrSetHash(exprhdlr, hashExp);
503 SCIPexprhdlrSetDiff(exprhdlr, bwdiffExp, NULL, NULL);
504 SCIPexprhdlrSetCurvature(exprhdlr, curvatureExp);
505 SCIPexprhdlrSetMonotonicity(exprhdlr, monotonicityExp);
506
507 return SCIP_OKAY;
508}
509
510/** creates an exponential expression */
512 SCIP* scip, /**< SCIP data structure */
513 SCIP_EXPR** expr, /**< pointer where to store expression */
514 SCIP_EXPR* child, /**< single child */
515 SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), /**< function to call to create ownerdata */
516 void* ownercreatedata /**< data to pass to ownercreate */
517 )
518{
519 assert(expr != NULL);
520 assert(child != NULL);
522
523 SCIP_CALL( SCIPcreateExpr(scip, expr, SCIPfindExprhdlr(scip, EXPRHDLR_NAME), NULL, 1, &child, ownercreate, ownercreatedata) );
524
525 return SCIP_OKAY;
526}
527
528/** indicates whether expression is of exp-type */ /*lint -e{715}*/
530 SCIP* scip, /**< SCIP data structure */
531 SCIP_EXPR* expr /**< expression */
532 )
533{ /*lint --e{715}*/
534 assert(expr != NULL);
535
536 return strcmp(SCIPexprhdlrGetName(SCIPexprGetHdlr(expr)), EXPRHDLR_NAME) == 0;
537}
#define NULL
Definition def.h:257
#define SCIP_INVALID
Definition def.h:187
#define SCIP_INTERVAL_INFINITY
Definition def.h:189
#define SCIP_Bool
Definition def.h:100
#define MIN(x, y)
Definition def.h:233
#define SCIP_STRINGEQ(name, reference, retcode)
Definition def.h:454
#define SCIP_Real
Definition def.h:165
#define TRUE
Definition def.h:102
#define FALSE
Definition def.h:103
#define MAX(x, y)
Definition def.h:229
#define REALABS(x)
Definition def.h:191
#define SCIP_CALL(x)
Definition def.h:364
#define EXPRHDLR_HASHKEY
Definition expr_abs.c:41
#define EXPRHDLR_NAME
Definition expr_abs.c:38
#define EXPRHDLR_DESC
Definition expr_abs.c:39
#define EXPRHDLR_PRECEDENCE
Definition expr_abs.c:40
static void addExpSecant(SCIP *scip, SCIP_Real lb, SCIP_Real ub, SCIP_Real *lincoef, SCIP_Real *linconstant, SCIP_Bool *success)
Definition expr_exp.c:57
static void addExpLinearization(SCIP *scip, SCIP_Real refpoint, SCIP_Bool isint, SCIP_Real *lincoef, SCIP_Real *linconstant, SCIP_Bool *success)
Definition expr_exp.c:108
exponential expression handler
constant value expression handler
SCIP_Bool SCIPisExprExp(SCIP *scip, SCIP_EXPR *expr)
Definition expr_exp.c:529
SCIP_RETCODE SCIPcreateExprExp(SCIP *scip, SCIP_EXPR **expr, SCIP_EXPR *child, SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), void *ownercreatedata)
Definition expr_exp.c:511
SCIP_RETCODE SCIPcreateExprValue(SCIP *scip, SCIP_EXPR **expr, SCIP_Real value, SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), void *ownercreatedata)
Definition expr_value.c:274
SCIP_RETCODE SCIPincludeExprhdlrExp(SCIP *scip)
Definition expr_exp.c:485
const char * SCIPexprhdlrGetName(SCIP_EXPRHDLR *exprhdlr)
Definition expr.c:545
void SCIPexprhdlrSetCurvature(SCIP_EXPRHDLR *exprhdlr,)
Definition expr.c:418
void SCIPexprhdlrSetParse(SCIP_EXPRHDLR *exprhdlr,)
Definition expr.c:407
void SCIPexprhdlrSetIntEval(SCIP_EXPRHDLR *exprhdlr,)
Definition expr.c:488
void SCIPexprhdlrSetMonotonicity(SCIP_EXPRHDLR *exprhdlr,)
Definition expr.c:429
void SCIPexprhdlrSetReverseProp(SCIP_EXPRHDLR *exprhdlr,)
Definition expr.c:510
void SCIPexprhdlrSetHash(SCIP_EXPRHDLR *exprhdlr,)
Definition expr.c:451
SCIP_RETCODE SCIPincludeExprhdlr(SCIP *scip, SCIP_EXPRHDLR **exprhdlr, const char *name, const char *desc, unsigned int precedence, SCIP_DECL_EXPREVAL((*eval)), SCIP_EXPRHDLRDATA *data)
Definition scip_expr.c:847
void SCIPexprhdlrSetSimplify(SCIP_EXPRHDLR *exprhdlr,)
Definition expr.c:499
void SCIPexprhdlrSetDiff(SCIP_EXPRHDLR *exprhdlr, SCIP_DECL_EXPRBWDIFF((*bwdiff)), SCIP_DECL_EXPRFWDIFF((*fwdiff)),)
Definition expr.c:473
void SCIPexprhdlrSetCopyFreeHdlr(SCIP_EXPRHDLR *exprhdlr, SCIP_DECL_EXPRCOPYHDLR((*copyhdlr)),)
Definition expr.c:370
SCIP_EXPRHDLR * SCIPfindExprhdlr(SCIP *scip, const char *name)
Definition scip_expr.c:894
void SCIPexprhdlrSetCopyFreeData(SCIP_EXPRHDLR *exprhdlr, SCIP_DECL_EXPRCOPYDATA((*copydata)),)
Definition expr.c:383
void SCIPexprhdlrSetEstimate(SCIP_EXPRHDLR *exprhdlr, SCIP_DECL_EXPRINITESTIMATES((*initestimates)),)
Definition expr.c:532
SCIP_RETCODE SCIPcreateExpr(SCIP *scip, SCIP_EXPR **expr, SCIP_EXPRHDLR *exprhdlr, SCIP_EXPRDATA *exprdata, int nchildren, SCIP_EXPR **children, SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), void *ownercreatedata)
Definition scip_expr.c:1000
void SCIPexprSetData(SCIP_EXPR *expr, SCIP_EXPRDATA *exprdata)
Definition expr.c:3920
int SCIPexprGetNChildren(SCIP_EXPR *expr)
Definition expr.c:3872
SCIP_Bool SCIPexprIsIntegral(SCIP_EXPR *expr)
Definition expr.c:4101
SCIP_Bool SCIPisExprValue(SCIP *scip, SCIP_EXPR *expr)
Definition scip_expr.c:1468
SCIP_RETCODE SCIPreleaseExpr(SCIP *scip, SCIP_EXPR **expr)
Definition scip_expr.c:1443
SCIP_EXPRDATA * SCIPexprGetData(SCIP_EXPR *expr)
Definition expr.c:3905
SCIP_RETCODE SCIPparseExpr(SCIP *scip, SCIP_EXPR **expr, const char *exprstr, const char **finalpos, SCIP_DECL_EXPR_OWNERCREATE((*ownercreate)), void *ownercreatedata)
Definition scip_expr.c:1406
SCIP_Real SCIPgetValueExprValue(SCIP_EXPR *expr)
Definition expr_value.c:298
SCIP_Real SCIPexprGetEvalValue(SCIP_EXPR *expr)
Definition expr.c:3946
SCIP_EXPR ** SCIPexprGetChildren(SCIP_EXPR *expr)
Definition expr.c:3882
SCIP_INTERVAL SCIPexprGetActivity(SCIP_EXPR *expr)
Definition expr.c:4028
void SCIPcaptureExpr(SCIP_EXPR *expr)
Definition scip_expr.c:1435
SCIP_EXPRHDLR * SCIPexprGetHdlr(SCIP_EXPR *expr)
Definition expr.c:3895
SCIP_Real SCIPintervalGetInf(SCIP_INTERVAL interval)
SCIP_Bool SCIPintervalIsEmpty(SCIP_Real infinity, SCIP_INTERVAL operand)
struct SCIP_Interval SCIP_INTERVAL
void SCIPintervalLog(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand)
SCIP_Real SCIPintervalGetSup(SCIP_INTERVAL interval)
void SCIPintervalExp(SCIP_Real infinity, SCIP_INTERVAL *resultant, SCIP_INTERVAL operand)
void SCIPintervalSetEmpty(SCIP_INTERVAL *resultant)
SCIP_Bool SCIPisGE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisIntegral(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisLE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Real SCIPfloor(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisInfinity(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisEQ(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
return SCIP_OKAY
assert(minobj< SCIPgetCutoffbound(scip))
struct SCIP_Expr SCIP_EXPR
Definition type_expr.h:55
#define SCIP_DECL_EXPR_OWNERCREATE(x)
Definition type_expr.h:143
#define SCIP_DECL_EXPRREVERSEPROP(x)
Definition type_expr.h:659
#define SCIP_DECL_EXPRINITESTIMATES(x)
Definition type_expr.h:610
#define SCIP_DECL_EXPRCURVATURE(x)
Definition type_expr.h:340
#define SCIP_DECL_EXPRFREEDATA(x)
Definition type_expr.h:268
@ SCIP_EXPRCURV_CONVEX
Definition type_expr.h:63
#define SCIP_DECL_EXPRPARSE(x)
Definition type_expr.h:312
#define SCIP_DECL_EXPRBWDIFF(x)
Definition type_expr.h:451
#define SCIP_DECL_EXPRINTEVAL(x)
Definition type_expr.h:541
#define SCIP_DECL_EXPRMONOTONICITY(x)
Definition type_expr.h:358
@ SCIP_MONOTONE_INC
Definition type_expr.h:72
struct SCIP_Exprhdlr SCIP_EXPRHDLR
Definition type_expr.h:194
#define SCIP_DECL_EXPRSIMPLIFY(x)
Definition type_expr.h:634
#define SCIP_DECL_EXPREVAL(x)
Definition type_expr.h:428
#define SCIP_DECL_EXPRHASH(x)
Definition type_expr.h:393
#define SCIP_DECL_EXPRCOPYHDLR(x)
Definition type_expr.h:210
#define SCIP_DECL_EXPRCOPYDATA(x)
Definition type_expr.h:249
#define SCIP_DECL_EXPRESTIMATE(x)
Definition type_expr.h:577
@ SCIP_INVALIDCALL
enum SCIP_Retcode SCIP_RETCODE
struct Scip SCIP
Definition type_scip.h:39