1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 2 /* */ 3 /* This file is part of the program and library */ 4 /* SCIP --- Solving Constraint Integer Programs */ 5 /* */ 6 /* Copyright (c) 2002-2023 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_event.h 26 * @ingroup TYPEDEFINITIONS 27 * @brief type definitions for managing events 28 * @author Tobias Achterberg 29 * @author Leona Gottwald 30 * 31 * This file defines the interface for event handler implemented in C. 32 * 33 * - \ref scip::ObjEventhdlr "C++ wrapper class" 34 */ 35 36 /** @defgroup DEFPLUGINS_EVENT Default event handlers 37 * @ingroup DEFPLUGINS 38 * @brief implementation files (.c files) of the default event handlers of SCIP 39 */ 40 41 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/ 42 43 #ifndef __SCIP_TYPE_EVENT_H__ 44 #define __SCIP_TYPE_EVENT_H__ 45 46 #include "scip/def.h" 47 #include "scip/type_retcode.h" 48 #include "scip/type_scip.h" 49 50 #if !defined(_MSC_VER) || _MSC_VER > 1600 51 #ifdef __cplusplus 52 #define __STDC_FORMAT_MACROS 53 #endif 54 #include <inttypes.h> 55 #else 56 #define PRIx64 "llx" 57 #endif 58 59 #ifdef __cplusplus 60 extern "C" { 61 #endif 62 63 /* 64 * event types 65 */ 66 67 #define SCIP_EVENTTYPE_DISABLED UINT64_C(0x000000000) /**< the event was disabled and has no effect any longer */ 68 69 /* variable events */ 70 #define SCIP_EVENTTYPE_VARADDED UINT64_C(0x000000001) /**< a variable has been added to the transformed problem */ 71 #define SCIP_EVENTTYPE_VARDELETED UINT64_C(0x000000002) /**< a variable will be deleted from the transformed problem */ 72 #define SCIP_EVENTTYPE_VARFIXED UINT64_C(0x000000004) /**< a variable has been fixed, aggregated, or multi-aggregated */ 73 #define SCIP_EVENTTYPE_VARUNLOCKED UINT64_C(0x000000008) /**< the number of rounding locks of a variable was reduced to zero or one */ 74 #define SCIP_EVENTTYPE_OBJCHANGED UINT64_C(0x000000010) /**< the objective value of a variable has been changed */ 75 #define SCIP_EVENTTYPE_GLBCHANGED UINT64_C(0x000000020) /**< the global lower bound of a variable has been changed */ 76 #define SCIP_EVENTTYPE_GUBCHANGED UINT64_C(0x000000040) /**< the global upper bound of a variable has been changed */ 77 #define SCIP_EVENTTYPE_LBTIGHTENED UINT64_C(0x000000080) /**< the local lower bound of a variable has been increased */ 78 #define SCIP_EVENTTYPE_LBRELAXED UINT64_C(0x000000100) /**< the local lower bound of a variable has been decreased */ 79 #define SCIP_EVENTTYPE_UBTIGHTENED UINT64_C(0x000000200) /**< the local upper bound of a variable has been decreased */ 80 #define SCIP_EVENTTYPE_UBRELAXED UINT64_C(0x000000400) /**< the local upper bound of a variable has been increased */ 81 #define SCIP_EVENTTYPE_GHOLEADDED UINT64_C(0x000000800) /**< a global hole has been added to the hole list of a variable's domain */ 82 #define SCIP_EVENTTYPE_GHOLEREMOVED UINT64_C(0x000001000) /**< a global hole has been removed from the hole list of a variable's domain */ 83 #define SCIP_EVENTTYPE_LHOLEADDED UINT64_C(0x000002000) /**< a local hole has been added to the hole list of a variable's domain */ 84 #define SCIP_EVENTTYPE_LHOLEREMOVED UINT64_C(0x000004000) /**< a local hole has been removed from the hole list of a variable's domain */ 85 #define SCIP_EVENTTYPE_IMPLADDED UINT64_C(0x000008000) /**< the variable's implication list, variable bound or clique information was extended */ 86 #define SCIP_EVENTTYPE_TYPECHANGED UINT64_C(0x000010000) /**< the type of a variable has changed */ 87 88 /* presolving events */ 89 #define SCIP_EVENTTYPE_PRESOLVEROUND UINT64_C(0x000020000) /**< a presolving round has been finished */ 90 91 /* node events */ 92 #define SCIP_EVENTTYPE_NODEFOCUSED UINT64_C(0x000040000) /**< a node has been focused and is now the focus node */ 93 #define SCIP_EVENTTYPE_NODEFEASIBLE UINT64_C(0x000080000) /**< the LP/pseudo solution of the node was feasible */ 94 #define SCIP_EVENTTYPE_NODEINFEASIBLE UINT64_C(0x000100000) /**< the focus node has been proven to be infeasible or was bounded */ 95 #define SCIP_EVENTTYPE_NODEBRANCHED UINT64_C(0x000200000) /**< the focus node has been solved by branching */ 96 #define SCIP_EVENTTYPE_NODEDELETE UINT64_C(0x000400000) /**< a node is about to be deleted from the tree */ 97 98 99 /* LP events */ 100 #define SCIP_EVENTTYPE_FIRSTLPSOLVED UINT64_C(0x000800000) /**< the node's initial LP was solved */ 101 #define SCIP_EVENTTYPE_LPSOLVED UINT64_C(0x001000000) /**< the node's LP was completely solved with cut & price */ 102 103 /* primal solution events */ 104 #define SCIP_EVENTTYPE_POORSOLFOUND UINT64_C(0x002000000) /**< a good enough primal feasible (but not new best) solution was found */ 105 #define SCIP_EVENTTYPE_BESTSOLFOUND UINT64_C(0x004000000) /**< a new best primal feasible solution was found */ 106 107 /* linear row events */ 108 #define SCIP_EVENTTYPE_ROWADDEDSEPA UINT64_C(0x008000000) /**< a row has been added to SCIP's separation storage */ 109 #define SCIP_EVENTTYPE_ROWDELETEDSEPA UINT64_C(0x010000000) /**< a row has been removed from SCIP's separation storage */ 110 #define SCIP_EVENTTYPE_ROWADDEDLP UINT64_C(0x020000000) /**< a row has been added to the LP */ 111 #define SCIP_EVENTTYPE_ROWDELETEDLP UINT64_C(0x040000000) /**< a row has been removed from the LP */ 112 #define SCIP_EVENTTYPE_ROWCOEFCHANGED UINT64_C(0x080000000) /**< a coefficient of a row has been changed (row specific event) */ 113 #define SCIP_EVENTTYPE_ROWCONSTCHANGED UINT64_C(0x100000000) /**< the constant of a row has been changed (row specific event) */ 114 #define SCIP_EVENTTYPE_ROWSIDECHANGED UINT64_C(0x200000000) /**< a side of a row has been changed (row specific event) */ 115 116 /* sync event */ 117 #define SCIP_EVENTTYPE_SYNC UINT64_C(0x400000000) /**< synchronization event */ 118 119 /* event masks for variable events */ 120 #define SCIP_EVENTTYPE_GBDCHANGED (SCIP_EVENTTYPE_GLBCHANGED | SCIP_EVENTTYPE_GUBCHANGED) 121 #define SCIP_EVENTTYPE_LBCHANGED (SCIP_EVENTTYPE_LBTIGHTENED | SCIP_EVENTTYPE_LBRELAXED) 122 #define SCIP_EVENTTYPE_UBCHANGED (SCIP_EVENTTYPE_UBTIGHTENED | SCIP_EVENTTYPE_UBRELAXED) 123 #define SCIP_EVENTTYPE_BOUNDTIGHTENED (SCIP_EVENTTYPE_LBTIGHTENED | SCIP_EVENTTYPE_UBTIGHTENED) 124 #define SCIP_EVENTTYPE_BOUNDRELAXED (SCIP_EVENTTYPE_LBRELAXED | SCIP_EVENTTYPE_UBRELAXED) 125 #define SCIP_EVENTTYPE_BOUNDCHANGED (SCIP_EVENTTYPE_LBCHANGED | SCIP_EVENTTYPE_UBCHANGED) 126 #define SCIP_EVENTTYPE_GHOLECHANGED (SCIP_EVENTTYPE_GHOLEADDED | SCIP_EVENTTYPE_GHOLEREMOVED) 127 #define SCIP_EVENTTYPE_LHOLECHANGED (SCIP_EVENTTYPE_LHOLEADDED | SCIP_EVENTTYPE_LHOLEREMOVED) 128 #define SCIP_EVENTTYPE_HOLECHANGED (SCIP_EVENTTYPE_GHOLECHANGED | SCIP_EVENTTYPE_LHOLECHANGED) 129 #define SCIP_EVENTTYPE_DOMCHANGED (SCIP_EVENTTYPE_BOUNDCHANGED | SCIP_EVENTTYPE_HOLECHANGED) 130 #define SCIP_EVENTTYPE_VARCHANGED (SCIP_EVENTTYPE_VARFIXED | SCIP_EVENTTYPE_VARUNLOCKED | SCIP_EVENTTYPE_OBJCHANGED \ 131 | SCIP_EVENTTYPE_GBDCHANGED | SCIP_EVENTTYPE_DOMCHANGED | SCIP_EVENTTYPE_IMPLADDED \ 132 | SCIP_EVENTTYPE_VARDELETED | SCIP_EVENTTYPE_TYPECHANGED) 133 #define SCIP_EVENTTYPE_VAREVENT (SCIP_EVENTTYPE_VARADDED | SCIP_EVENTTYPE_VARCHANGED | SCIP_EVENTTYPE_TYPECHANGED) 134 135 /* event masks for node events */ 136 #define SCIP_EVENTTYPE_NODESOLVED (SCIP_EVENTTYPE_NODEFEASIBLE | SCIP_EVENTTYPE_NODEINFEASIBLE \ 137 | SCIP_EVENTTYPE_NODEBRANCHED) 138 #define SCIP_EVENTTYPE_NODEEVENT (SCIP_EVENTTYPE_NODEFOCUSED | SCIP_EVENTTYPE_NODESOLVED) 139 140 /* event masks for LP events */ 141 #define SCIP_EVENTTYPE_LPEVENT (SCIP_EVENTTYPE_FIRSTLPSOLVED | SCIP_EVENTTYPE_LPSOLVED) 142 143 /* event masks for primal solution events */ 144 #define SCIP_EVENTTYPE_SOLFOUND (SCIP_EVENTTYPE_POORSOLFOUND | SCIP_EVENTTYPE_BESTSOLFOUND) 145 #define SCIP_EVENTTYPE_SOLEVENT (SCIP_EVENTTYPE_SOLFOUND) 146 147 /* event masks for row events */ 148 #define SCIP_EVENTTYPE_ROWCHANGED (SCIP_EVENTTYPE_ROWCOEFCHANGED | SCIP_EVENTTYPE_ROWCONSTCHANGED | SCIP_EVENTTYPE_ROWSIDECHANGED) 149 #define SCIP_EVENTTYPE_ROWEVENT (SCIP_EVENTTYPE_ROWADDEDSEPA | SCIP_EVENTTYPE_ROWDELETEDSEPA | SCIP_EVENTTYPE_ROWADDEDLP | SCIP_EVENTTYPE_ROWDELETEDLP | SCIP_EVENTTYPE_ROWCHANGED) 150 151 typedef uint64_t SCIP_EVENTTYPE; /**< type of event (bit field) */ 152 #define SCIP_EVENTTYPE_FORMAT PRIx64 153 154 typedef struct SCIP_Eventhdlr SCIP_EVENTHDLR; /**< event handler for a specific events */ 155 typedef struct SCIP_EventhdlrData SCIP_EVENTHDLRDATA; /**< event handler data */ 156 typedef struct SCIP_Event SCIP_EVENT; /**< event data structure */ 157 typedef struct SCIP_EventVarAdded SCIP_EVENTVARADDED; /**< data for variable addition events */ 158 typedef struct SCIP_EventVarDeleted SCIP_EVENTVARDELETED; /**< data for variable deletion events */ 159 typedef struct SCIP_EventVarFixed SCIP_EVENTVARFIXED; /**< data for variable fixing events */ 160 typedef struct SCIP_EventVarUnlocked SCIP_EVENTVARUNLOCKED; /**< data for variable unlocked events */ 161 typedef struct SCIP_EventObjChg SCIP_EVENTOBJCHG; /**< data for objective value change events */ 162 typedef struct SCIP_EventBdChg SCIP_EVENTBDCHG; /**< data for bound change events */ 163 typedef struct SCIP_EventHole SCIP_EVENTHOLE; /**< data for domain hole events */ 164 typedef struct SCIP_EventImplAdd SCIP_EVENTIMPLADD; /**< data for implication added events */ 165 typedef struct SCIP_EventTypeChg SCIP_EVENTTYPECHG; /**< data for variable type change events */ 166 typedef struct SCIP_EventRowAddedSepa SCIP_EVENTROWADDEDSEPA; /**< data for row addition to sepastorage events */ 167 typedef struct SCIP_EventRowDeletedSepa SCIP_EVENTROWDELETEDSEPA; /**< data for row deletion from sepastorage events */ 168 typedef struct SCIP_EventRowAddedLP SCIP_EVENTROWADDEDLP; /**< data for row addition to LP events */ 169 typedef struct SCIP_EventRowDeletedLP SCIP_EVENTROWDELETEDLP; /**< data for row deletion from LP events */ 170 typedef struct SCIP_EventRowCoefChanged SCIP_EVENTROWCOEFCHANGED; /**< data for row coefficient change events */ 171 typedef struct SCIP_EventRowConstChanged SCIP_EVENTROWCONSTCHANGED; /**< data for row constant change events */ 172 typedef struct SCIP_EventRowSideChanged SCIP_EVENTROWSIDECHANGED; /**< data for row side change events */ 173 typedef struct SCIP_EventData SCIP_EVENTDATA; /**< locally defined event specific data */ 174 typedef struct SCIP_EventFilter SCIP_EVENTFILTER; /**< event filter to select events to be processed by an event handler */ 175 typedef struct SCIP_EventQueue SCIP_EVENTQUEUE; /**< event queue to cache events and process them later */ 176 177 /** copy method for event handler plugins (called when SCIP copies plugins) 178 * 179 * input: 180 * - scip : SCIP main data structure 181 * - eventhdlr : the event handler itself 182 */ 183 #define SCIP_DECL_EVENTCOPY(x) SCIP_RETCODE x (SCIP* scip, SCIP_EVENTHDLR* eventhdlr) 184 185 /** destructor of event handler to free user data (called when SCIP is exiting) 186 * 187 * input: 188 * - scip : SCIP main data structure 189 * - eventhdlr : the event handler itself 190 */ 191 #define SCIP_DECL_EVENTFREE(x) SCIP_RETCODE x (SCIP* scip, SCIP_EVENTHDLR* eventhdlr) 192 193 /** initialization method of event handler (called after problem was transformed) 194 * 195 * input: 196 * - scip : SCIP main data structure 197 * - eventhdlr : the event handler itself 198 */ 199 #define SCIP_DECL_EVENTINIT(x) SCIP_RETCODE x (SCIP* scip, SCIP_EVENTHDLR* eventhdlr) 200 201 /** deinitialization method of event handler (called before transformed problem is freed) 202 * 203 * input: 204 * - scip : SCIP main data structure 205 * - eventhdlr : the event handler itself 206 */ 207 #define SCIP_DECL_EVENTEXIT(x) SCIP_RETCODE x (SCIP* scip, SCIP_EVENTHDLR* eventhdlr) 208 209 /** solving process initialization method of event handler (called when branch and bound process is about to begin) 210 * 211 * This method is called when the presolving was finished and the branch and bound process is about to begin. 212 * The event handler may use this call to initialize its branch and bound specific data. 213 * 214 * input: 215 * - scip : SCIP main data structure 216 * - eventhdlr : the event handler itself 217 */ 218 #define SCIP_DECL_EVENTINITSOL(x) SCIP_RETCODE x (SCIP* scip, SCIP_EVENTHDLR* eventhdlr) 219 220 /** solving process deinitialization method of event handler (called before branch and bound process data is freed) 221 * 222 * This method is called before the branch and bound process is freed. 223 * The event handler should use this call to clean up its branch and bound data. 224 * 225 * input: 226 * - scip : SCIP main data structure 227 * - eventhdlr : the event handler itself 228 */ 229 #define SCIP_DECL_EVENTEXITSOL(x) SCIP_RETCODE x (SCIP* scip, SCIP_EVENTHDLR* eventhdlr) 230 231 /** frees specific event data 232 * 233 * input: 234 * - scip : SCIP main data structure 235 * - eventhdlr : the event handler itself 236 * - eventdata : pointer to the event data to free 237 */ 238 #define SCIP_DECL_EVENTDELETE(x) SCIP_RETCODE x (SCIP* scip, SCIP_EVENTHDLR* eventhdlr, SCIP_EVENTDATA** eventdata) 239 240 /** execution method of event handler 241 * 242 * Processes the event. The method is called every time an event occurs, for which the event handler 243 * is responsible. Event handlers may declare themselves responsible for events by calling the 244 * corresponding SCIPcatch...() method. This method creates an event filter object to point to the 245 * given event handler and event data. 246 * 247 * input: 248 * - scip : SCIP main data structure 249 * - eventhdlr : the event handler itself 250 * - event : event to process 251 * - eventdata : user data for the event 252 */ 253 #define SCIP_DECL_EVENTEXEC(x) SCIP_RETCODE x (SCIP* scip, SCIP_EVENTHDLR* eventhdlr, SCIP_EVENT* event, SCIP_EVENTDATA* eventdata) 254 255 #ifdef __cplusplus 256 } 257 #endif 258 259 #endif 260