Scippy

    SCIP

    Solving Constraint Integer Programs

    type_nlhdlr.h
    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-2025 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 type_nlhdlr.h
    26 * @ingroup TYPEDEFINITIONS
    27 * @brief type definitions related to nonlinear handlers of nonlinear constraints
    28 * @author Ksenia Bestuzheva
    29 * @author Benjamin Mueller
    30 * @author Felipe Serrano
    31 * @author Stefan Vigerske
    32 *
    33 * This file defines the interface for nonlinear handlers.
    34 *
    35 * - \ref NLHDLRS "List of available nonlinear handlers"
    36 */
    37
    38/** @defgroup DEFPLUGINS_NLHDLR Default nonlinear handlers
    39 * @ingroup DEFPLUGINS
    40 * @brief implementation files (.c files) of the default nonlinear handlers of SCIP
    41 */
    42
    43#ifndef SCIP_TYPE_NLHDLR_H_
    44#define SCIP_TYPE_NLHDLR_H_
    45
    46#include "scip/type_expr.h"
    47#include "scip/type_cons.h"
    48#include "scip/type_misc.h"
    49
    50#define SCIP_NLHDLR_METHOD_NONE 0x0u /**< no enforcement */
    51#define SCIP_NLHDLR_METHOD_SEPABELOW 0x1u /**< separation for expr <= auxvar, thus might estimate expr from below */
    52#define SCIP_NLHDLR_METHOD_SEPAABOVE 0x2u /**< separation for expr >= auxvar, thus might estimate expr from above */
    53#define SCIP_NLHDLR_METHOD_SEPABOTH (SCIP_NLHDLR_METHOD_SEPABELOW | SCIP_NLHDLR_METHOD_SEPAABOVE) /**< separation for expr == auxvar */
    54#define SCIP_NLHDLR_METHOD_ACTIVITY 0x4u /**< activity computation (interval evaluation) and propagation (reverse propagation) */
    55#define SCIP_NLHDLR_METHOD_ALL (SCIP_NLHDLR_METHOD_SEPABOTH | SCIP_NLHDLR_METHOD_ACTIVITY) /**< all enforcement methods */
    56
    57typedef unsigned int SCIP_NLHDLR_METHOD; /**< nlhdlr methods bitflags */
    58
    59/** nonlinear handler copy callback
    60 *
    61 * The method includes the nonlinear handler into a nonlinear constraint handler.
    62 *
    63 * This method is usually called when doing a copy of a nonlinear constraint handler.
    64 *
    65 * \param[in] targetscip target SCIP main data structure
    66 * \param[in] targetconshdlr target nonlinear constraint handler
    67 * \param[out] sourceconshdlr nonlinear constraint handler in source SCIP
    68 * \param[out] sourcenlhdlr nonlinear handler in source SCIP
    69 */
    70#define SCIP_DECL_NLHDLRCOPYHDLR(x) SCIP_RETCODE x (\
    71 SCIP* targetscip, \
    72 SCIP_CONSHDLR* targetconshdlr, \
    73 SCIP_CONSHDLR* sourceconshdlr, \
    74 SCIP_NLHDLR* sourcenlhdlr)
    75
    76/** callback to free data of handler
    77 *
    78 * \param[in] scip SCIP data structure
    79 * \param[in] nlhdlr nonlinear handler
    80 * \param[in] nlhdlrdata nonlinear handler data to be freed
    81 */
    82#define SCIP_DECL_NLHDLRFREEHDLRDATA(x) SCIP_RETCODE x (\
    83 SCIP* scip, \
    84 SCIP_NLHDLR* nlhdlr, \
    85 SCIP_NLHDLRDATA** nlhdlrdata)
    86
    87/** callback to free expression specific data
    88 *
    89 * \param[in] scip SCIP data structure
    90 * \param[in] nlhdlr nonlinear handler
    91 * \param[in] expr expression
    92 * \param[in] nlhdlrexprdata nonlinear handler expression data to be freed
    93 */
    94#define SCIP_DECL_NLHDLRFREEEXPRDATA(x) SCIP_RETCODE x (\
    95 SCIP* scip, \
    96 SCIP_NLHDLR* nlhdlr, \
    97 SCIP_EXPR* expr, \
    98 SCIP_NLHDLREXPRDATA** nlhdlrexprdata)
    99
    100/** callback to be called in initialization (called after problem was transformed)
    101 *
    102 * \param[in] scip SCIP data structure
    103 * \param[in] nlhdlr nonlinear handler
    104 */
    105#define SCIP_DECL_NLHDLRINIT(x) SCIP_RETCODE x (\
    106 SCIP* scip, \
    107 SCIP_NLHDLR* nlhdlr)
    108
    109/** callback to be called in deinitialization (called before transformed problem is freed)
    110 *
    111 * \param[in] scip SCIP data structure
    112 * \param[in] nlhdlr nonlinear handler
    113 */
    114#define SCIP_DECL_NLHDLREXIT(x) SCIP_RETCODE x (\
    115 SCIP* scip, \
    116 SCIP_NLHDLR* nlhdlr)
    117
    118/** callback to detect structure in expression
    119 *
    120 * The nonlinear handler shall analyze the current expression and decide whether it wants to contribute
    121 * in enforcing the relation between this expression (`expr`) and its descendants (e.g., children) via
    122 * linear under- or overestimation, cut generation, and/or activity computation and propagation.
    123 * For linear under- or overestimation and cut generation, an auxiliary variable (`auxvar`) can be assumed to
    124 * be associated with `expr` and auxiliary variables may be requested in descendant expressions.
    125 *
    126 * We distinguish the following enforcement methods:
    127 * - \ref SCIP_NLHDLR_METHOD_SEPABELOW : linear underestimation of `expr` or cut generation for the relation `expr` &le; `auxvar` (denoted as "below")
    128 * - \ref SCIP_NLHDLR_METHOD_SEPAABOVE : linear overestimation of `expr` or cut generation for the relation `expr` &ge; `auxvar` (denoted as "above")
    129 * - \ref SCIP_NLHDLR_METHOD_ACTIVITY : domain propagation (i.e., constant under/overestimation) for the relation `expr` = `auxvar`.
    130 *
    131 * On input, parameter `enforcing` indicates for any of these methods, whether
    132 * - it is not necessary to have such a method, e.g., because no `auxvar` will exist for `expr`, or no one uses or sets activities of this expression,
    133 * or because analysis of the expression has shown that a relation like `expr` &ge; `auxvar` is not necessary to be satisfied,
    134 * - or there already exists a nonlinear handler that will provide this method in an "enforcement" sense, that is,
    135 * it believes that no one else could provide this method in a stronger sense. (This is mainly used by nlhdlr_default to check whether
    136 * it should still reach out to the exprhdlr or whether it would be dominated by some nonlinear handler.)
    137 *
    138 * The DETECT callback shall augment the `enforcing` bitmask by setting the enforcement methods it wants to provide in an "enforcement" sense.
    139 *
    140 * Additionally, the `participating` bitmask shall be set if the nonlinear handler wants to be called on this expression at all.
    141 * Here, it shall set all methods that it wants to provide, which are those set in `enforcing`, but additionally those where it wants
    142 * to participate but leave enforcement to another nonlinear handler.
    143 * This can be useful for nonlinear handlers that do not implement a complete enforcement, e.g., a handler that only contributes
    144 * cutting planes in some situations only.
    145 *
    146 * A nonlinear handler will be called only for those callbacks that it mentioned in `participating`, which is
    147 * - \ref SCIP_DECL_NLHDLRENFO "ENFO" and/or \ref SCIP_DECL_NLHDLRESTIMATE "ESTIMATE" will be called with `overestimate==FALSE` if \ref SCIP_NLHDLR_METHOD_SEPABELOW has been set
    148 * - \ref SCIP_DECL_NLHDLRENFO "ENFO" and/or \ref SCIP_DECL_NLHDLRESTIMATE "ESTIMATE" will be called with `overestimate==TRUE` if \ref SCIP_NLHDLR_METHOD_SEPAABOVE has been set
    149 * - \ref SCIP_DECL_NLHDLRINTEVAL "INTEVAL" and/or \ref SCIP_DECL_NLHDLRREVERSEPROP "REVERSEPROP" will be called if \ref SCIP_NLHDLR_METHOD_ACTIVITY has been set
    150 *
    151 * If \ref SCIP_NLHDLR_METHOD_SEPABELOW or \ref SCIP_NLHDLR_METHOD_SEPAABOVE has been set, then at least one of the
    152 * callbacks \ref SCIP_DECL_NLHDLRENFO "ENFO" and \ref SCIP_DECL_NLHDLRESTIMATE "ESTIMATE" needs to be implemented.
    153 * Also \ref SCIP_DECL_NLHDLREVALAUX "EVALAUX" will be called in this case.
    154 * If \ref SCIP_NLHDLR_METHOD_ACTIVITY has been set, then at least one of \ref SCIP_DECL_NLHDLRINTEVAL "INTEVAL" and
    155 * \ref SCIP_DECL_NLHDLRREVERSEPROP "REVERSEPROP" needs to be implemented.
    156 * If the nonlinear handler chooses not to participate, then it must not set `nlhdlrexprdata` and can leave `participating` at its
    157 * initial value (\ref SCIP_NLHDLR_METHOD_NONE).
    158 *
    159 * Additionally, a nonlinear handler that decides to participate in any of the enforcement methods must call
    160 * @ref SCIPregisterExprUsageNonlinear() for every subexpression that it will use and indicate whether
    161 * - it will use an auxiliary variable in \ref SCIP_DECL_NLHDLRENFO "ENFO" or \ref SCIP_DECL_NLHDLRESTIMATE "ESTIMATE",
    162 * - it will use activity for some subexpressions when computing estimators or cuts, and
    163 * - it will use activity for some subexpressions when in \ref SCIP_DECL_NLHDLRINTEVAL "INTEVAL" or \ref SCIP_DECL_NLHDLRREVERSEPROP "REVERSEPROP".
    164 *
    165 * @note Auxiliary variables do not exist in subexpressions during DETECT and are not created by a call to @ref SCIPregisterExprUsageNonlinear().
    166 * They will be available when the \ref SCIP_DECL_NLHDLRINITSEPA "INITSEPA" callback is called.
    167 *
    168 * \param[in] scip SCIP data structure
    169 * \param[in] conshdlr nonlinear constraint handler
    170 * \param[in] nlhdlr nonlinear handler
    171 * \param[in] expr expression to analyze
    172 * \param[in] cons the constraint that expression defines, or NULL when the expr does not define any constraint, that is, when it is not the root of an expression of a constraint
    173 * \param[in,out] enforcing enforcement methods that are provided by some nonlinear handler (to be updated by detect callback)
    174 * \param[out] participating enforcement methods that this nonlinear handler should be called for (to be set by detect callback), initialized to SCIP_NLHDLR_METHOD_NONE
    175 * \param[out] nlhdlrexprdata nlhdlr's expr data to be stored in expr, can only be set to non-NULL if success is set to TRUE
    176 */
    177#define SCIP_DECL_NLHDLRDETECT(x) SCIP_RETCODE x (\
    178 SCIP* scip, \
    179 SCIP_CONSHDLR* conshdlr, \
    180 SCIP_NLHDLR* nlhdlr, \
    181 SCIP_EXPR* expr, \
    182 SCIP_CONS* cons, \
    183 SCIP_NLHDLR_METHOD* enforcing, \
    184 SCIP_NLHDLR_METHOD* participating, \
    185 SCIP_NLHDLREXPRDATA** nlhdlrexprdata)
    186
    187/** auxiliary evaluation callback of nonlinear handler
    188 *
    189 * Evaluates the expression w.r.t. the auxiliary variables that were introduced by the nonlinear handler (if any).
    190 * The method is used to determine the violation of the relation that the nonlinear handler attempts to enforce.
    191 * During enforcement, this violation value is used to decide whether estimation/separation callbacks should be called.
    192 *
    193 * It can be assumed that the expression itself has been evaluated in the given sol.
    194 *
    195 * \param[in] scip SCIP data structure
    196 * \param[in] nlhdlr nonlinear handler
    197 * \param[in] expr expression to evaluate
    198 * \param[in] nlhdlrexprdata expression specific data of the nonlinear handler
    199 * \param[out] auxvalue buffer to store value of expression w.r.t. auxiliary variables
    200 * \param[in] sol point to evaluate
    201 */
    202#define SCIP_DECL_NLHDLREVALAUX(x) SCIP_RETCODE x (\
    203 SCIP* scip, \
    204 SCIP_NLHDLR* nlhdlr, \
    205 SCIP_EXPR* expr, \
    206 SCIP_NLHDLREXPRDATA* nlhdlrexprdata, \
    207 SCIP_Real* auxvalue, \
    208 SCIP_SOL* sol)
    209
    210/** nonlinear handler interval evaluation (activity computation) callback
    211 *
    212 * The method computes an interval that contains the image (range) of the expression.
    213 *
    214 * \param[in] scip SCIP main data structure
    215 * \param[in] nlhdlr nonlinear handler
    216 * \param[in] expr expression
    217 * \param[in] nlhdlrexprdata expression specific data of the nonlinear handler
    218 * \param[in,out] interval buffer where to store interval (on input: current interval for expr, on output: computed interval for expr)
    219 * \param[in] intevalvar callback to be called when interval evaluating a variable
    220 * \param[in] intevalvardata data to be passed to intevalvar callback
    221 */
    222#define SCIP_DECL_NLHDLRINTEVAL(x) SCIP_RETCODE x (\
    223 SCIP* scip, \
    224 SCIP_NLHDLR* nlhdlr, \
    225 SCIP_EXPR* expr, \
    226 SCIP_NLHDLREXPRDATA* nlhdlrexprdata, \
    227 SCIP_INTERVAL* interval, \
    228 SCIP_DECL_EXPR_INTEVALVAR((*intevalvar)), \
    229 void* intevalvardata)
    230
    231/** nonlinear handler callback for reverse propagation
    232 *
    233 * The method propagates the given bounds over the arguments of an expression.
    234 * The arguments of an expression are other expressions and the tighter intervals should be passed
    235 * to the corresponding argument (expression) via SCIPtightenExprIntervalNonlinear().
    236 *
    237 * \param[in] scip SCIP main data structure
    238 * \param[in] conshdlr nonlinear constraint handler
    239 * \param[in] nlhdlr nonlinear handler
    240 * \param[in] expr expression
    241 * \param[in] nlhdlrexprdata expression specific data of the nonlinear handler
    242 * \param[in] bounds the bounds on the expression that should be propagated
    243 * \param[out] infeasible buffer to store whether an expression's bounds were propagated to an empty interval
    244 * \param[out] nreductions buffer to store the number of interval reductions of all children
    245 */
    246#define SCIP_DECL_NLHDLRREVERSEPROP(x) SCIP_RETCODE x (\
    247 SCIP* scip, \
    248 SCIP_CONSHDLR* conshdlr, \
    249 SCIP_NLHDLR* nlhdlr, \
    250 SCIP_EXPR* expr, \
    251 SCIP_NLHDLREXPRDATA* nlhdlrexprdata, \
    252 SCIP_INTERVAL bounds, \
    253 SCIP_Bool* infeasible, \
    254 int* nreductions)
    255
    256/** separation initialization method of a nonlinear handler (called during CONSINITLP)
    257 *
    258 * The method shall initialize the separation data of the nonlinear handler, if any, and add initial cuts to the LP relaxation.
    259 *
    260 * \param[in] scip SCIP main data structure
    261 * \param[in] conshdlr nonlinear constraint handler
    262 * \param[in] cons nonlinear constraint
    263 * \param[in] nlhdlr nonlinear handler
    264 * \param[in] nlhdlrexprdata exprdata of nonlinear handler
    265 * \param[in] expr expression
    266 * \param[in] overestimate whether the expression needs to be overestimated
    267 * \param[in] underestimate whether the expression needs to be underestimated
    268 * \param[out] infeasible buffer to store whether infeasibility was detected while building the LP
    269 */
    270#define SCIP_DECL_NLHDLRINITSEPA(x) SCIP_RETCODE x (\
    271 SCIP* scip, \
    272 SCIP_CONSHDLR* conshdlr, \
    273 SCIP_CONS* cons, \
    274 SCIP_NLHDLR* nlhdlr, \
    275 SCIP_EXPR* expr, \
    276 SCIP_NLHDLREXPRDATA* nlhdlrexprdata, \
    277 SCIP_Bool overestimate, \
    278 SCIP_Bool underestimate, \
    279 SCIP_Bool* infeasible)
    280
    281/** separation deinitialization method of a nonlinear handler (called during CONSEXITSOL)
    282 *
    283 * The method shall deinitialize the separation data of the nonlinear handler, if any.
    284 *
    285 * \param[in] scip SCIP main data structure
    286 * \param[in] nlhdlr nonlinear handler
    287 * \param[in] nlhdlrexprdata exprdata of nonlinear handler
    288 * \param[in] expr expression
    289 */
    290#define SCIP_DECL_NLHDLREXITSEPA(x) SCIP_RETCODE x (\
    291 SCIP* scip, \
    292 SCIP_NLHDLR* nlhdlr, \
    293 SCIP_EXPR* expr, \
    294 SCIP_NLHDLREXPRDATA* nlhdlrexprdata)
    295
    296/** nonlinear handler separation and enforcement callback
    297 *
    298 * The method tries to separate the given solution from the set defined by either
    299 * <pre>
    300 * expr - auxvar <= 0 (if !overestimate)
    301 * </pre>
    302 * or
    303 * <pre>
    304 * expr - auxvar >= 0 (if overestimate),
    305 * </pre>
    306 * where `auxvar = SCIPgetExprAuxVarNonlinear(expr)`.
    307 *
    308 * It can do so by
    309 * - separation, i.e., finding an affine hyperplane (a cut) that separates the given point,
    310 * - bound tightening, i.e., changing bounds on a variable so that the given point is outside the updated domain,
    311 * - adding branching scores to potentially split the current problem into 2 subproblems
    312 *
    313 * If parameter `inenforcement` is FALSE, then only the first option (separation) is allowed.
    314 *
    315 * If the nonlinear handler always separates by computing a linear under- or overestimator of expr,
    316 * then it could be advantageous to implement the \ref SCIP_DECL_NLHDLRESTIMATE "ESTIMATE" callback instead.
    317 *
    318 * Note, that the nonlinear handler may also choose to separate for a relaxation of the mentioned sets,
    319 * e.g., `expr` &le; upperbound(`auxvar`) or `expr` &ge; lowerbound(`auxvar`).
    320 * This is especially useful in situations where `expr` is the root expression of a constraint
    321 * and it is sufficient to satisfy `lhs` &le; `expr` &le; `rhs`.
    322 * cons_nonlinear ensures that `lhs` &le; lowerbound(`auxvar`) and upperbound(`auxvar`) &le; `rhs`.
    323 *
    324 * cons_nonlinear may call this callback first with `allowweakcuts` = FALSE and repeat later with
    325 * `allowweakcuts` = TRUE, if it didn't succeed to enforce a solution without using weak cuts.
    326 * If in enforcement and the nonlinear handler cannot enforce by separation or bound tightening, it should register
    327 * branching scores for those expressions where branching may help to compute tighter cuts in children.
    328 * If `branchcandonly`, then cons_nonlinear is interested in collecting potential branching candidates only
    329 * (in order to decide whether to enforce nonlinear constraints before integrality). Therefore, in this situation,
    330 * the nlhdlr should not do anything if it normally (`branchcandonly`=FALSE) were to separate or tighten bounds.
    331 * (Since in the normal mode it will only add branching candidates if it does no separation/tightening.)
    332 * In other words, with `branchcandonly` = TRUE, the nlhdlr should follow the same logic as for
    333 * `branchcandonly` = FALSE, but skip the addition of cuts or bound tightenings.
    334 *
    335 * The nonlinear handler must set `result` to \ref SCIP_SEPARATED if it added a cut,
    336 * to \ref SCIP_REDUCEDDOM if it added a bound change,
    337 * to \ref SCIP_CUTOFF if it found the current node infeasible, and
    338 * to \ref SCIP_BRANCHED if it added branching scores.
    339 * Otherwise, it may set result to \ref SCIP_DIDNOTRUN or \ref SCIP_DIDNOTFIND.
    340 * If `branchcandonly`, then SCIP_SEPARATED and SCIP_REDUCEDDOM are not allowed.
    341 *
    342 * Parameter `cons` gives the constraint that is currently enforced.
    343 * Note that `expr` does not need to be the root of this constraint, i.e., `SCIPgetExprNonlinear(cons)==expr` may not hold.
    344 * If an expression appears in several constraints, it is not well defined which constraint is given in `cons`.
    345 * The main purpose of `cons` is to provide a constraint source for LP rows that are added in this callback.
    346 *
    347 * \param[in] scip SCIP main data structure
    348 * \param[in] conshdlr nonlinear constraint handler
    349 * \param[in] cons nonlinear constraint that is currently enforced
    350 * \param[in] nlhdlr nonlinear handler
    351 * \param[in] expr expression
    352 * \param[in] nlhdlrexprdata expression specific data of the nonlinear handler
    353 * \param[in] sol solution to be separated (NULL for the LP solution)
    354 * \param[in] auxvalue current value of expression w.r.t. auxiliary variables as obtained from \ref SCIP_DECL_NLHDLREVALAUX "EVALAUX"
    355 * \param[in] overestimate whether the expression needs to be over- or underestimated
    356 * \param[in] allowweakcuts whether we should only look for "strong" cuts, or anything that separates is fine
    357 * \param[in] separated whether another nonlinear handler already added a cut for this expression
    358 * \param[in] inenforcement whether we are in enforcement, or only in separation
    359 * \param[in] branchcandonly whether to generate branching candidates only (no separation or propagation; detecting infeasibility is ok)
    360 * \param[out] result pointer to store the result
    361 */
    362#define SCIP_DECL_NLHDLRENFO(x) SCIP_RETCODE x (\
    363 SCIP* scip, \
    364 SCIP_CONSHDLR* conshdlr, \
    365 SCIP_CONS* cons, \
    366 SCIP_NLHDLR* nlhdlr, \
    367 SCIP_EXPR* expr, \
    368 SCIP_NLHDLREXPRDATA* nlhdlrexprdata, \
    369 SCIP_SOL* sol, \
    370 SCIP_Real auxvalue, \
    371 SCIP_Bool overestimate, \
    372 SCIP_Bool allowweakcuts, \
    373 SCIP_Bool separated, \
    374 SCIP_Bool addbranchscores, \
    375 SCIP_Bool branchcandonly, \
    376 SCIP_RESULT* result)
    377
    378/** nonlinear handler under/overestimation callback
    379 *
    380 * The method tries to compute linear under- or overestimators of `expr` that are as tight as possible at a given point.
    381 * Note that the cons_nonlinear handler adds an auxvar into a rowprep automatically after this callback.
    382 * Therefore, the rowprep should only store the estimator in this callback.
    383 * If the value of the estimator in the solution is smaller (larger) than `targetvalue`
    384 * when underestimating (overestimating), then no estimator needs to be computed.
    385 * Note, that `targetvalue` can be infinite if any estimator will be accepted.
    386 * If successful, it shall store the estimators in the given `rowpreps` data structure and set the
    387 * `rowprep->local` flag accordingly (SCIProwprepSetLocal()).
    388 * The sidetype of a rowprep must be set to \ref SCIP_SIDETYPE_LEFT if overestimating and
    389 * \ref SCIP_SIDETYPE_RIGHT if underestimating.
    390 *
    391 * If the callback is required to indicate for which expression a reduction in the local bounds (usually by branching)
    392 * would improve the estimator, it shall do so via calls to SCIPaddExprsViolScoreNonlinear().
    393 *
    394 * \param[in] scip SCIP main data structure
    395 * \param[in] conshdlr constraint handler
    396 * \param[in] nlhdlr nonlinear handler
    397 * \param[in] expr expression
    398 * \param[in] nlhdlrexprdata expression data of nonlinear handler
    399 * \param[in] sol solution at which to estimate (NULL for the LP solution)
    400 * \param[in] auxvalue current value of expression w.r.t. auxiliary variables as obtained from \ref SCIP_DECL_NLHDLREVALAUX "EVALAUX"
    401 * \param[in] overestimate whether the expression needs to be over- or underestimated
    402 * \param[in] targetvalue a value the estimator shall exceed, can be +/-infinity
    403 * \param[in] addbranchscores indicates whether to register branching scores
    404 * \param[out] rowpreps an array where to store the estimators
    405 * \param[out] success buffer to indicate whether an estimator could be computed
    406 * \param[out] addedbranchscores buffer to store whether the branching score callback was successful
    407 */
    408#define SCIP_DECL_NLHDLRESTIMATE(x) SCIP_RETCODE x (\
    409 SCIP* scip, \
    410 SCIP_CONSHDLR* conshdlr, \
    411 SCIP_NLHDLR* nlhdlr, \
    412 SCIP_EXPR* expr, \
    413 SCIP_NLHDLREXPRDATA* nlhdlrexprdata, \
    414 SCIP_SOL* sol, \
    415 SCIP_Real auxvalue, \
    416 SCIP_Bool overestimate, \
    417 SCIP_Real targetvalue, \
    418 SCIP_Bool addbranchscores, \
    419 SCIP_PTRARRAY* rowpreps, \
    420 SCIP_Bool* success, \
    421 SCIP_Bool* addedbranchscores)
    422
    423/** nonlinear handler solution linearization callback
    424 *
    425 * The callback is called when a new feasible solution has been found.
    426 * The nonlinear handler may add tight estimates on its nonlinear function to the cut pool of SCIP.
    427 *
    428 * \param[in] scip SCIP main data structure
    429 * \param[in] conshdlr constraint handler
    430 * \param[in] cons a nonlinear constraint which includes expression
    431 * \param[in] nlhdlr nonlinear handler
    432 * \param[in] expr expression
    433 * \param[in] nlhdlrexprdata expression data of nonlinear handler
    434 * \param[in] sol solution that has been found
    435 * \param[in] solisbest whether solution is new best solution (incumbent)
    436 * \param[in] overestimate whether the expression needs is overestimated by the nlhdlr
    437 * \param[in] underestimate whether the expression needs is underestimated by the nlhdlr
    438 */
    439#define SCIP_DECL_NLHDLRSOLLINEARIZE(x) SCIP_RETCODE x (\
    440 SCIP* scip, \
    441 SCIP_CONSHDLR* conshdlr, \
    442 SCIP_CONS* cons, \
    443 SCIP_NLHDLR* nlhdlr, \
    444 SCIP_EXPR* expr, \
    445 SCIP_NLHDLREXPRDATA* nlhdlrexprdata, \
    446 SCIP_SOL* sol, \
    447 SCIP_Bool solisbest, \
    448 SCIP_Bool overestimate, \
    449 SCIP_Bool underestimate)
    450
    451typedef struct SCIP_Nlhdlr SCIP_NLHDLR; /**< nonlinear handler */
    452typedef struct SCIP_NlhdlrData SCIP_NLHDLRDATA; /**< nonlinear handler data */
    453typedef struct SCIP_NlhdlrExprData SCIP_NLHDLREXPRDATA; /**< nonlinear handler data for a specific expression */
    454
    455#endif /* SCIP_TYPE_NLHDLR_H_ */
    type definitions for constraints and constraint handlers
    type and macro definitions related to algebraic expressions
    type definitions for miscellaneous datastructures
    struct SCIP_NlhdlrData SCIP_NLHDLRDATA
    Definition: type_nlhdlr.h:452
    unsigned int SCIP_NLHDLR_METHOD
    Definition: type_nlhdlr.h:57
    struct SCIP_NlhdlrExprData SCIP_NLHDLREXPRDATA
    Definition: type_nlhdlr.h:453