Scippy

    SCIP

    Solving Constraint Integer Programs

    exprinterpret.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 exprinterpret.h
    26 * @brief methods to interpret (evaluate) an expression "fast"
    27 * @ingroup EXPRINTS
    28 * @author Stefan Vigerske
    29 *
    30 * Realized similar to LPI: one implementation of an interpreter is linked in.
    31 */
    32
    33/* @todo product Gradient times vector
    34 @todo product Hessian times vector
    35 @todo product Hessian of Lagrangian times vector?
    36 @todo sparse Hessian of Lagrangian (sets of expressions)?
    37*/
    38
    39/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    40
    41#ifndef __SCIP_EXPRINTERPRET_H__
    42#define __SCIP_EXPRINTERPRET_H__
    43
    44#include "scip/def.h"
    46#include "scip/type_scip.h"
    47#include "scip/type_expr.h"
    48
    49#ifdef __cplusplus
    50extern "C" {
    51#endif
    52
    53/**@addtogroup EXPRINTS
    54 * @{
    55 */
    56
    57/** gets name and version of expression interpreter */
    58SCIP_EXPORT
    59const char* SCIPexprintGetName(void);
    60
    61/** gets descriptive text of expression interpreter */
    62SCIP_EXPORT
    63const char* SCIPexprintGetDesc(void);
    64
    65/** gets capabilities of expression interpreter (using bitflags) */
    66SCIP_EXPORT
    68
    69/** creates an expression interpreter object */
    70SCIP_EXPORT
    72 SCIP* scip, /**< SCIP data structure */
    73 SCIP_EXPRINT** exprint /**< buffer to store pointer to expression interpreter */
    74 );
    75
    76/** frees an expression interpreter object */
    77SCIP_EXPORT
    79 SCIP* scip, /**< SCIP data structure */
    80 SCIP_EXPRINT** exprint /**< expression interpreter that should be freed */
    81 );
    82
    83/** compiles an expression and returns interpreter-specific data for expression
    84 *
    85 * can be called again with existing exprintdata if expression has been changed
    86 *
    87 * @attention *exprintdata needs to be initialized to NULL at first call
    88 * @attention the expression is assumed to use varidx expressions instead of var expressions
    89 */
    90SCIP_EXPORT
    92 SCIP* scip, /**< SCIP data structure */
    93 SCIP_EXPRINT* exprint, /**< interpreter data structure */
    94 SCIP_EXPR* expr, /**< expression */
    95 SCIP_EXPRINTDATA** exprintdata /**< buffer to store pointer to compiled data */
    96 );
    97
    98/** frees interpreter data for expression */
    99SCIP_EXPORT
    101 SCIP* scip, /**< SCIP data structure */
    102 SCIP_EXPRINT* exprint, /**< interpreter data structure */
    103 SCIP_EXPR* expr, /**< expression */
    104 SCIP_EXPRINTDATA** exprintdata /**< pointer to pointer to compiled data to be freed */
    105 );
    106
    107/** gives the capability to evaluate an expression by the expression interpreter
    108 *
    109 * In cases of user-given expressions, higher order derivatives may not be available for the user-expression,
    110 * even if the expression interpreter could handle these. This method allows to recognize that, e.g., the
    111 * Hessian for an expression is not available because it contains a user expression that does not provide
    112 * Hessians.
    113 */
    114SCIP_EXPORT
    116 SCIP* scip, /**< SCIP data structure */
    117 SCIP_EXPRINT* exprint, /**< interpreter data structure */
    118 SCIP_EXPR* expr, /**< expression */
    119 SCIP_EXPRINTDATA* exprintdata /**< interpreter-specific data for expression */
    120 );
    121
    122/** evaluates an expression */
    123SCIP_EXPORT
    125 SCIP* scip, /**< SCIP data structure */
    126 SCIP_EXPRINT* exprint, /**< interpreter data structure */
    127 SCIP_EXPR* expr, /**< expression */
    128 SCIP_EXPRINTDATA* exprintdata, /**< interpreter-specific data for expression */
    129 SCIP_Real* varvals, /**< values of variables */
    130 SCIP_Real* val /**< buffer to store value of expression */
    131 );
    132
    133/** computes value and gradient of an expression */
    134SCIP_EXPORT
    136 SCIP* scip, /**< SCIP data structure */
    137 SCIP_EXPRINT* exprint, /**< interpreter data structure */
    138 SCIP_EXPR* expr, /**< expression */
    139 SCIP_EXPRINTDATA* exprintdata, /**< interpreter-specific data for expression */
    140 SCIP_Real* varvals, /**< values of variables, can be NULL if new_varvals is FALSE */
    141 SCIP_Bool new_varvals, /**< have variable values changed since last call to a point evaluation routine? */
    142 SCIP_Real* val, /**< buffer to store expression value */
    143 SCIP_Real* gradient /**< buffer to store expression gradient */
    144 );
    145
    146/** gives sparsity pattern of lower-triangular part of Hessian
    147 *
    148 * Since the AD code might need to do a forward sweep, variable values need to be passed in here.
    149 *
    150 * Result will have `(*colidxs)[i] <= (*rowidixs)[i]` for `i=0..*nnz`.
    151 */
    152SCIP_EXPORT
    154 SCIP* scip, /**< SCIP data structure */
    155 SCIP_EXPRINT* exprint, /**< interpreter data structure */
    156 SCIP_EXPR* expr, /**< expression */
    157 SCIP_EXPRINTDATA* exprintdata, /**< interpreter-specific data for expression */
    158 SCIP_Real* varvals, /**< values of variables */
    159 int** rowidxs, /**< buffer to return array with row indices of Hessian elements */
    160 int** colidxs, /**< buffer to return array with column indices of Hessian elements */
    161 int* nnz /**< buffer to return length of arrays */
    162 );
    163
    164/** computes value and Hessian of an expression
    165 *
    166 * Returned arrays `rowidxs` and `colidxs` and number of elements `nnz` are the same as given by SCIPexprintHessianSparsity().
    167 * Returned array `hessianvals` will contain the corresponding Hessian elements.
    168 */
    169SCIP_EXPORT
    171 SCIP* scip, /**< SCIP data structure */
    172 SCIP_EXPRINT* exprint, /**< interpreter data structure */
    173 SCIP_EXPR* expr, /**< expression */
    174 SCIP_EXPRINTDATA* exprintdata, /**< interpreter-specific data for expression */
    175 SCIP_Real* varvals, /**< values of variables, can be NULL if new_varvals is FALSE */
    176 SCIP_Bool new_varvals, /**< have variable values changed since last call to an evaluation routine? */
    177 SCIP_Real* val, /**< buffer to store function value */
    178 int** rowidxs, /**< buffer to return array with row indices of Hessian elements */
    179 int** colidxs, /**< buffer to return array with column indices of Hessian elements */
    180 SCIP_Real** hessianvals, /**< buffer to return array with Hessian elements */
    181 int* nnz /**< buffer to return length of arrays */
    182 );
    183
    184/** @} */
    185
    186#ifdef __cplusplus
    187}
    188#endif
    189
    190#endif /* __SCIP_EXPRINTERPRET_H__ */
    common defines and data types used in all packages of SCIP
    #define SCIP_Bool
    Definition: def.h:91
    #define SCIP_Real
    Definition: def.h:156
    SCIP_RETCODE SCIPexprintCompile(SCIP *scip, SCIP_EXPRINT *exprint, SCIP_EXPR *expr, SCIP_EXPRINTDATA **exprintdata)
    SCIP_RETCODE SCIPexprintFreeData(SCIP *scip, SCIP_EXPRINT *exprint, SCIP_EXPR *expr, SCIP_EXPRINTDATA **exprintdata)
    SCIP_EXPRINTCAPABILITY SCIPexprintGetCapability(void)
    SCIP_RETCODE SCIPexprintHessianSparsity(SCIP *scip, SCIP_EXPRINT *exprint, SCIP_EXPR *expr, SCIP_EXPRINTDATA *exprintdata, SCIP_Real *varvals, int **rowidxs, int **colidxs, int *nnz)
    SCIP_RETCODE SCIPexprintFree(SCIP *scip, SCIP_EXPRINT **exprint)
    SCIP_RETCODE SCIPexprintEval(SCIP *scip, SCIP_EXPRINT *exprint, SCIP_EXPR *expr, SCIP_EXPRINTDATA *exprintdata, SCIP_Real *varvals, SCIP_Real *val)
    const char * SCIPexprintGetName(void)
    const char * SCIPexprintGetDesc(void)
    SCIP_EXPRINTCAPABILITY SCIPexprintGetExprCapability(SCIP *scip, SCIP_EXPRINT *exprint, SCIP_EXPR *expr, SCIP_EXPRINTDATA *exprintdata)
    SCIP_RETCODE SCIPexprintHessian(SCIP *scip, SCIP_EXPRINT *exprint, SCIP_EXPR *expr, SCIP_EXPRINTDATA *exprintdata, SCIP_Real *varvals, SCIP_Bool new_varvals, SCIP_Real *val, int **rowidxs, int **colidxs, SCIP_Real **hessianvals, int *nnz)
    SCIP_RETCODE SCIPexprintCreate(SCIP *scip, SCIP_EXPRINT **exprint)
    SCIP_RETCODE SCIPexprintGrad(SCIP *scip, SCIP_EXPRINT *exprint, SCIP_EXPR *expr, SCIP_EXPRINTDATA *exprintdata, SCIP_Real *varvals, SCIP_Bool new_varvals, SCIP_Real *val, SCIP_Real *gradient)
    type and macro definitions related to algebraic expressions
    type definitions for expression interpreter
    struct SCIP_ExprIntData SCIP_EXPRINTDATA
    struct SCIP_ExprInt SCIP_EXPRINT
    unsigned int SCIP_EXPRINTCAPABILITY
    enum SCIP_Retcode SCIP_RETCODE
    Definition: type_retcode.h:63
    type definitions for SCIP's main datastructure