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