1    	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2    	/*                                                                           */
3    	/*                  This file is part of the program and library             */
4    	/*         SCIP --- Solving Constraint Integer Programs                      */
5    	/*                                                                           */
6    	/*    Copyright (C) 2002-2021 Konrad-Zuse-Zentrum                            */
7    	/*                            fuer Informationstechnik Berlin                */
8    	/*                                                                           */
9    	/*  SCIP is distributed under the terms of the ZIB Academic License.         */
10   	/*                                                                           */
11   	/*  You should have received a copy of the ZIB Academic License              */
12   	/*  along with SCIP; see the file COPYING. If not visit scipopt.org.         */
13   	/*                                                                           */
14   	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
15   	
16   	/**@file   struct_event.h
17   	 * @ingroup INTERNALAPI
18   	 * @brief  datastructures for managing events
19   	 * @author Tobias Achterberg
20   	 */
21   	
22   	/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
23   	
24   	#ifndef __SCIP_STRUCT_EVENT_H__
25   	#define __SCIP_STRUCT_EVENT_H__
26   	
27   	
28   	#include "scip/def.h"
29   	#include "scip/type_clock.h"
30   	#include "scip/type_event.h"
31   	#include "scip/type_var.h"
32   	#include "scip/type_sol.h"
33   	#include "scip/type_tree.h"
34   	
35   	#ifdef __cplusplus
36   	extern "C" {
37   	#endif
38   	
39   	/** data for variable addition events */
40   	struct SCIP_EventVarAdded
41   	{
42   	   SCIP_VAR*             var;                /**< variable that was added to the problem */
43   	};
44   	
45   	/** data for variable deletion events */
46   	struct SCIP_EventVarDeleted
47   	{
48   	   SCIP_VAR*             var;                /**< variable that will be deleted from the problem */
49   	};
50   	
51   	/** data for variable fixing events */
52   	struct SCIP_EventVarFixed
53   	{
54   	   SCIP_VAR*             var;                /**< variable that was fixed */
55   	};
56   	
57   	/** data for locks change events */
58   	struct SCIP_EventVarUnlocked
59   	{
60   	   SCIP_VAR*             var;                /**< variable for which the lock numbers were changed */
61   	};
62   	
63   	/** data for objective value change events */
64   	struct SCIP_EventObjChg
65   	{
66   	   SCIP_Real             oldobj;             /**< old objective value before value changed */
67   	   SCIP_Real             newobj;             /**< new objective value after value changed */
68   	   SCIP_VAR*             var;                /**< variable whose objective value changed */
69   	};
70   	
71   	/** data for bound change events */
72   	struct SCIP_EventBdChg
73   	{
74   	   SCIP_Real             oldbound;           /**< old bound before bound changed */
75   	   SCIP_Real             newbound;           /**< new bound after bound changed */
76   	   SCIP_VAR*             var;                /**< variable whose bound changed */
77   	};
78   	
79   	/** data for domain hole events */
80   	struct SCIP_EventHole
81   	{
82   	   SCIP_Real             left;               /**< left bound of open interval in hole */
83   	   SCIP_Real             right;              /**< right bound of open interval in hole */
84   	   SCIP_VAR*             var;                /**< variable for which a hole was removed */
85   	};
86   	
87   	/** data for implication added events */
88   	struct SCIP_EventImplAdd
89   	{
90   	   SCIP_VAR*             var;                /**< variable for which an implication, variable bound, or clique was added */
91   	};
92   	
93   	/** data for variable type change events */
94   	struct SCIP_EventTypeChg
95   	{
96   	   SCIP_VARTYPE          oldtype;            /**< old variable type */
97   	   SCIP_VARTYPE          newtype;            /**< new variable type */
98   	   SCIP_VAR*             var;                /**< variable whose type changed */
99   	};
100  	
101  	/** data for row addition to separation storage events */
102  	struct SCIP_EventRowAddedSepa
103  	{
104  	   SCIP_ROW*             row;                /**< row that was added to separation storage */
105  	};
106  	
107  	/** data for row deletion from separation storage events */
108  	struct SCIP_EventRowDeletedSepa
109  	{
110  	   SCIP_ROW*             row;                /**< row that was deleted from separation storage */
111  	};
112  	
113  	/** data for row addition to LP events */
114  	struct SCIP_EventRowAddedLP
115  	{
116  	   SCIP_ROW*             row;                /**< row that was added to the LP */
117  	};
118  	
119  	/** data for row deletion from LP events */
120  	struct SCIP_EventRowDeletedLP
121  	{
122  	   SCIP_ROW*             row;                /**< row that was deleted from the LP */
123  	};
124  	
125  	/** data for row coefficient change events */
126  	struct SCIP_EventRowCoefChanged
127  	{
128  	   SCIP_ROW*             row;                /**< row which coefficient has changed */
129  	   SCIP_COL*             col;                /**< column which coefficient has changed */
130  	   SCIP_Real             oldval;             /**< old value of coefficient */
131  	   SCIP_Real             newval;             /**< new value of coefficient */
132  	};
133  	
134  	/** data for row constant change events */
135  	struct SCIP_EventRowConstChanged
136  	{
137  	   SCIP_ROW*             row;                /**< row which constant has changed */
138  	   SCIP_Real             oldval;             /**< old value of constant */
139  	   SCIP_Real             newval;             /**< new value of constant */
140  	};
141  	
142  	/** data for row side change events */
143  	struct SCIP_EventRowSideChanged
144  	{
145  	   SCIP_ROW*             row;                /**< row which side has changed */
146  	   SCIP_SIDETYPE         side;               /**< which side has changed */
147  	   SCIP_Real             oldval;             /**< old value of side */
148  	   SCIP_Real             newval;             /**< new value of side */
149  	};
150  	
151  	/** event data structure */
152  	struct SCIP_Event
153  	{
154  	   union
155  	   {
156  	      SCIP_EVENTVARADDED eventvaradded;       /**< data for variable addition events */
157  	      SCIP_EVENTVARDELETED eventvardeleted;   /**< data for variable deletion events */
158  	      SCIP_EVENTVARFIXED eventvarfixed;       /**< data for variable fixing events */
159  	      SCIP_EVENTVARUNLOCKED eventvarunlocked; /**< data for locks change events */
160  	      SCIP_EVENTOBJCHG   eventobjchg;         /**< data for objective value change events */
161  	      SCIP_EVENTBDCHG    eventbdchg;          /**< data for bound change events */
162  	      SCIP_EVENTHOLE     eventhole;           /**< data for domain hole events */
163  	      SCIP_EVENTIMPLADD  eventimpladd;        /**< data for implication added events */
164  	      SCIP_EVENTTYPECHG  eventtypechg;        /**< data for variable type change events */
165  	      SCIP_EVENTROWADDEDSEPA eventrowaddedsepa; /**< data for row addition to separation storage events */
166  	      SCIP_EVENTROWDELETEDSEPA eventrowdeletedsepa; /**< data for row deletion from separation storage events */
167  	      SCIP_EVENTROWADDEDLP eventrowaddedlp;   /**< data for row addition to LP events */
168  	      SCIP_EVENTROWDELETEDLP eventrowdeletedlp; /**< data for row deletion from LP events */
169  	      SCIP_EVENTROWCOEFCHANGED eventrowcoefchanged; /**< data for row coefficient change events */
170  	      SCIP_EVENTROWCONSTCHANGED eventrowconstchanged; /**< data for row constant change events */
171  	      SCIP_EVENTROWSIDECHANGED eventrowsidechanged; /**< data for row side change events */
172  	      SCIP_NODE*         node;                /**< data for node and LP events */
173  	      SCIP_SOL*          sol;                 /**< data for primal solution events */
174  	   } data;
175  	   SCIP_EVENTTYPE        eventtype;          /**< type of event */
176  	};
177  	
178  	/** event filter to select events to be processed by an event handler */
179  	struct SCIP_EventFilter
180  	{
181  	   SCIP_EVENTTYPE*       eventtypes;         /**< array with types of event to process; 0 marks a deleted event catch entry */
182  	   SCIP_EVENTHDLR**      eventhdlrs;         /**< array with event handlers to process the event */
183  	   SCIP_EVENTDATA**      eventdata;          /**< array with user data for the issued event */
184  	   int*                  nextpos;            /**< linked lists for free, delayed added and delayed deleted slot positions */
185  	   int                   size;               /**< size of filter arrays (available slots in arrays) */
186  	   int                   len;                /**< number entries in filter arrays (used and deleted) */
187  	   int                   firstfreepos;       /**< first deleted slot; remaining slots are in poslist */
188  	   int                   firstdeletedpos;    /**< first delayed deleted slot; remaining slots are in poslist */
189  	   SCIP_EVENTTYPE        eventmask;          /**< mask for events that are handled by any event handler in the filter */
190  	   SCIP_EVENTTYPE        delayedeventmask;   /**< mask for delayed added events */
191  	   SCIP_Bool             delayupdates;       /**< should additions and deletions to the filter be delayed? */
192  	};
193  	
194  	/** event handler */
195  	struct SCIP_Eventhdlr
196  	{
197  	   char*                 name;               /**< name of event handler */
198  	   char*                 desc;               /**< description of event handler */
199  	   SCIP_DECL_EVENTCOPY   ((*eventcopy));     /**< copy method of event handler or NULL if you don't want to copy your plugin into sub-SCIPs */
200  	   SCIP_DECL_EVENTFREE   ((*eventfree));     /**< destructor of event handler */
201  	   SCIP_DECL_EVENTINIT   ((*eventinit));     /**< initialize event handler */
202  	   SCIP_DECL_EVENTEXIT   ((*eventexit));     /**< deinitialize event handler */
203  	   SCIP_DECL_EVENTINITSOL((*eventinitsol));  /**< solving process initialization method of event handler */
204  	   SCIP_DECL_EVENTEXITSOL((*eventexitsol));  /**< solving process deinitialization method of event handler */
205  	   SCIP_DECL_EVENTDELETE ((*eventdelete));   /**< free specific event data */
206  	   SCIP_DECL_EVENTEXEC   ((*eventexec));     /**< execute event handler */
207  	   SCIP_EVENTHDLRDATA*   eventhdlrdata;      /**< event handler data */
208  	   SCIP_CLOCK*           setuptime;          /**< time spend for setting up this event handler for the next stages */
209  	   SCIP_CLOCK*           eventtime;          /**< time spend in this event handler execution method */
210  	   SCIP_Bool             initialized;        /**< is event handler initialized? */
211  	};
212  	
213  	/** event queue to cache events and process them later */
214  	struct SCIP_EventQueue
215  	{
216  	   SCIP_EVENT**          events;             /**< array with queued events */
217  	   int                   eventssize;         /**< number of available slots in events array */
218  	   int                   nevents;            /**< number of events in queue (used slots if events array) */
219  	   SCIP_Bool             delayevents;        /**< should the events be delayed and processed later? */
220  	};
221  	
222  	#ifdef __cplusplus
223  	}
224  	#endif
225  	
226  	#endif
227