Scippy

    SCIP

    Solving Constraint Integer Programs

    objvardata.cpp
    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 objvardata.cpp
    26 * @brief C++ wrapper for user variable data
    27 * @author Tobias Achterberg
    28 */
    29
    30/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    31
    32#include <cassert>
    33
    34#include "objvardata.h"
    35
    36
    37
    38
    39/*
    40 * Data structures
    41 */
    42
    43/** user variable data */
    44struct SCIP_VarData
    45{
    46 scip::ObjVardata* objvardata; /**< user variable data object */
    47 SCIP_Bool deleteobject; /**< should the user variable data object be deleted when variable is freed? */
    48};
    49
    50
    51
    52
    53/*
    54 * Callback methods of user variable data
    55 */
    56
    57extern "C"
    58{
    59
    60/** frees user data of original variable (called when the original variable is freed) */
    61static
    63{ /*lint --e{715}*/
    64 assert(vardata != NULL);
    65 assert(*vardata != NULL);
    66 assert((*vardata)->objvardata != NULL);
    67
    68 /* call virtual method of vardata object */
    69 SCIP_CALL( (*vardata)->objvardata->scip_delorig(scip, var) );
    70
    71 /* free vardata object */
    72 if( (*vardata)->deleteobject )
    73 delete (*vardata)->objvardata;
    74
    75 /* free vardata data */
    76 delete *vardata;
    77 *vardata = 0; /*lint !e64*/
    78
    79 return SCIP_OKAY;
    80}
    81
    82
    83/** creates user data of transformed variable by transforming the original user variable data
    84 * (called after variable was transformed)
    85 */
    86static
    88{ /*lint --e{715}*/
    89 scip::ObjVardata* objvardata; /*lint !e78 !e40 !e55 !e530 !e522*/
    90 SCIP_Bool deleteobject;
    91
    92 assert(sourcedata != NULL);
    93 assert(sourcedata->objvardata != NULL);
    94 assert(targetdata != NULL);
    95 assert(*targetdata == NULL);
    96
    97 /* call virtual method of vardata object */
    98 SCIP_CALL( sourcedata->objvardata->scip_trans(scip, targetvar, &objvardata, &deleteobject) ); /*lint !e40*/
    99
    100 /* create transformed user variable data */
    101 *targetdata = new SCIP_VARDATA;
    102 (*targetdata)->objvardata = objvardata; /*lint !e40*/
    103 (*targetdata)->deleteobject = deleteobject;
    104
    105 return SCIP_OKAY;
    106}
    107
    108
    109/** frees user data of transformed variable (called when the transformed variable is freed) */
    110static
    112{ /*lint --e{715}*/
    113 assert(vardata != NULL);
    114 assert(*vardata != NULL);
    115 assert((*vardata)->objvardata != NULL);
    116
    117 /* call virtual method of vardata object */
    118 SCIP_CALL( (*vardata)->objvardata->scip_deltrans(scip, var) );
    119
    120 /* free vardata object */
    121 if( (*vardata)->deleteobject )
    122 delete (*vardata)->objvardata;
    123
    124 /* free vardata data */
    125 delete *vardata;
    126 *vardata = 0; /*lint !e64*/
    127
    128 return SCIP_OKAY;
    129}
    130
    131/** copies user data if you want to copy it to a subscip */
    132static
    134{ /*lint --e{715}*/
    135 scip::ObjVardata* objvardata; /*lint !e78 !e40 !e55 !e530 !e522*/
    136
    137 assert(sourcedata != NULL);
    138 assert(sourcedata->objvardata != NULL);
    139 assert(targetdata != NULL);
    140 assert(*targetdata == NULL);
    141
    142 /* call virtual method of probdata object */
    143 SCIP_CALL( sourcedata->objvardata->scip_copy(scip, sourcescip, sourcevar, varmap, consmap, targetvar, &objvardata, result) ); /*lint !e40*/
    144
    145 if( objvardata != 0 )
    146 {
    147 assert(*result == SCIP_SUCCESS);
    148
    149 /* create traget user problem data */
    150 *targetdata = new SCIP_VARDATA;
    151 (*targetdata)->objvardata = objvardata; /*lint !e40*/
    152 (*targetdata)->deleteobject = TRUE; /* always delete object, because we created it */
    153 }
    154 else
    155 {
    156 assert(*result == SCIP_DIDNOTRUN);
    157 *targetdata = 0;
    158 }
    159
    160 return SCIP_OKAY;
    161}
    162
    163}
    164
    165
    166
    167
    168/*
    169 * user variable data specific interface methods
    170 */
    171
    172/** create and capture problem variable and associates the given variable data with the variable;
    173 * if variable is of integral type, fractional bounds are automatically rounded
    174 */
    176 SCIP* scip, /**< SCIP data structure */
    177 SCIP_VAR** var, /**< pointer to variable object */
    178 const char* name, /**< name of variable, or NULL for automatic name creation */
    179 SCIP_Real lb, /**< lower bound of variable */
    180 SCIP_Real ub, /**< upper bound of variable */
    181 SCIP_Real obj, /**< objective function value */
    182 SCIP_VARTYPE vartype, /**< type of variable */
    183 SCIP_Bool initial, /**< should var's column be present in the initial root LP? */
    184 SCIP_Bool removable, /**< is var's column removable from the LP (due to aging or cleanup)? */
    185 scip::ObjVardata* objvardata, /**< user variable data object */
    186 SCIP_Bool deleteobject /**< should the user variable data object be deleted when variable is freed? */
    187 )
    188{
    189 SCIP_VARDATA* vardata;
    190
    191 /* create user variable data */
    192 vardata = new SCIP_VARDATA;
    193 vardata->objvardata = objvardata;
    194 vardata->deleteobject = deleteobject;
    195
    196 /* create variable */
    197 SCIP_CALL( SCIPcreateVar(scip, var, name, lb, ub, obj, vartype, initial, removable,
    198 varDelorigObj, varTransObj, varDeltransObj, varCopyObj, vardata) ); /*lint !e429*/
    199
    200 return SCIP_OKAY; /*lint !e429*/
    201}
    202
    203/** create and capture problem variable with implied type and associates the given variable data with the variable;
    204 * if variable is of integral type, fractional bounds are automatically rounded
    205 */
    207 SCIP* scip, /**< SCIP data structure */
    208 SCIP_VAR** var, /**< pointer to variable object */
    209 const char* name, /**< name of variable, or NULL for automatic name creation */
    210 SCIP_Real lb, /**< lower bound of variable */
    211 SCIP_Real ub, /**< upper bound of variable */
    212 SCIP_Real obj, /**< objective function value */
    213 SCIP_VARTYPE vartype, /**< type of variable */
    214 SCIP_IMPLINTTYPE impltype, /**< implied integral type of the variable */
    215 SCIP_Bool initial, /**< should var's column be present in the initial root LP? */
    216 SCIP_Bool removable, /**< is var's column removable from the LP (due to aging or cleanup)? */
    217 scip::ObjVardata* objvardata, /**< user variable data object */
    218 SCIP_Bool deleteobject /**< should the user variable data object be deleted when variable is freed? */
    219 )
    220{
    221 SCIP_VARDATA* vardata;
    222
    223 /* create user variable data */
    224 vardata = new SCIP_VARDATA;
    225 vardata->objvardata = objvardata;
    226 vardata->deleteobject = deleteobject;
    227
    228 /* create variable */
    229 SCIP_CALL( SCIPcreateVarImpl(scip, var, name, lb, ub, obj, vartype, impltype, initial, removable,
    230 varDelorigObj, varTransObj, varDeltransObj, varCopyObj, vardata) ); /*lint !e429*/
    231
    232 return SCIP_OKAY; /*lint !e429*/
    233}
    234
    235/** gets user variable data object for given problem variable
    236 * Warning! This method should only be called after a variable was created with SCIPcreateObjVar().
    237 * Otherwise, a segmentation fault may arise, or an undefined pointer is returned.
    238 */
    240 SCIP* scip, /**< SCIP data structure */
    241 SCIP_VAR* var /**< problem variable */
    242 )
    243{
    244 SCIP_VARDATA* vardata;
    245
    246 vardata = SCIPvarGetData(var);
    247 assert(vardata != NULL);
    248
    249 return vardata->objvardata;
    250}
    251
    C++ wrapper for user variable data.
    Definition: objvardata.h:53
    #define NULL
    Definition: def.h:248
    #define SCIP_Bool
    Definition: def.h:91
    #define SCIP_Real
    Definition: def.h:156
    #define TRUE
    Definition: def.h:93
    #define SCIP_CALL(x)
    Definition: def.h:355
    SCIP_RETCODE SCIPcreateVarImpl(SCIP *scip, SCIP_VAR **var, const char *name, SCIP_Real lb, SCIP_Real ub, SCIP_Real obj, SCIP_VARTYPE vartype, SCIP_IMPLINTTYPE impltype, SCIP_Bool initial, SCIP_Bool removable, SCIP_DECL_VARDELORIG((*vardelorig)), SCIP_DECL_VARTRANS((*vartrans)), SCIP_DECL_VARDELTRANS((*vardeltrans)), SCIP_DECL_VARCOPY((*varcopy)), SCIP_VARDATA *vardata)
    Definition: scip_var.c:225
    SCIP_VARDATA * SCIPvarGetData(SCIP_VAR *var)
    Definition: var.c:23287
    SCIP_RETCODE SCIPcreateVar(SCIP *scip, SCIP_VAR **var, const char *name, SCIP_Real lb, SCIP_Real ub, SCIP_Real obj, SCIP_VARTYPE vartype, SCIP_Bool initial, SCIP_Bool removable, SCIP_DECL_VARDELORIG((*vardelorig)), SCIP_DECL_VARTRANS((*vartrans)), SCIP_DECL_VARDELTRANS((*vardeltrans)), SCIP_DECL_VARCOPY((*varcopy)), SCIP_VARDATA *vardata)
    Definition: scip_var.c:120
    static SCIP_DECL_VARDELTRANS(varDeltransObj)
    Definition: objvardata.cpp:111
    SCIP_RETCODE SCIPcreateObjVarImpl(SCIP *scip, SCIP_VAR **var, const char *name, SCIP_Real lb, SCIP_Real ub, SCIP_Real obj, SCIP_VARTYPE vartype, SCIP_IMPLINTTYPE impltype, SCIP_Bool initial, SCIP_Bool removable, scip::ObjVardata *objvardata, SCIP_Bool deleteobject)
    Definition: objvardata.cpp:206
    static SCIP_DECL_VARCOPY(varCopyObj)
    Definition: objvardata.cpp:133
    SCIP_RETCODE SCIPcreateObjVar(SCIP *scip, SCIP_VAR **var, const char *name, SCIP_Real lb, SCIP_Real ub, SCIP_Real obj, SCIP_VARTYPE vartype, SCIP_Bool initial, SCIP_Bool removable, scip::ObjVardata *objvardata, SCIP_Bool deleteobject)
    Definition: objvardata.cpp:175
    static SCIP_DECL_VARTRANS(varTransObj)
    Definition: objvardata.cpp:87
    scip::ObjVardata * SCIPgetObjVardata(SCIP *scip, SCIP_VAR *var)
    Definition: objvardata.cpp:239
    static SCIP_DECL_VARDELORIG(varDelorigObj)
    Definition: objvardata.cpp:62
    C++ wrapper for user variable data.
    @ SCIP_DIDNOTRUN
    Definition: type_result.h:42
    @ SCIP_SUCCESS
    Definition: type_result.h:58
    @ SCIP_OKAY
    Definition: type_retcode.h:42
    enum SCIP_Retcode SCIP_RETCODE
    Definition: type_retcode.h:63
    struct SCIP_VarData SCIP_VARDATA
    Definition: type_var.h:167
    enum SCIP_ImplintType SCIP_IMPLINTTYPE
    Definition: type_var.h:117
    enum SCIP_Vartype SCIP_VARTYPE
    Definition: type_var.h:73