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   scip_timing.h
26   	 * @ingroup PUBLICCOREAPI
27   	 * @brief  public methods for timing
28   	 * @author Tobias Achterberg
29   	 * @author Timo Berthold
30   	 * @author Thorsten Koch
31   	 * @author Alexander Martin
32   	 * @author Marc Pfetsch
33   	 * @author Kati Wolter
34   	 * @author Gregor Hendel
35   	 * @author Leona Gottwald
36   	 */
37   	
38   	/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
39   	
40   	#ifndef __SCIP_SCIP_TIMING_H__
41   	#define __SCIP_SCIP_TIMING_H__
42   	
43   	
44   	#include "scip/def.h"
45   	#include "scip/type_clock.h"
46   	#include "scip/type_retcode.h"
47   	#include "scip/type_scip.h"
48   	
49   	#ifdef __cplusplus
50   	extern "C" {
51   	#endif
52   	
53   	/**@addtogroup PublicTimingMethods
54   	 *
55   	 * @{
56   	 */
57   	
58   	/** gets current time of day in seconds (standard time zone)
59   	 *
60   	 *  @return the current time of day in seconds (standard time zone).
61   	 */
62   	SCIP_EXPORT
63   	SCIP_Real SCIPgetTimeOfDay(
64   	   SCIP*                 scip                /**< SCIP data structure */
65   	   );
66   	
67   	/** creates a clock using the default clock type
68   	 *
69   	 *  @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
70   	 *          SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
71   	 */
72   	SCIP_EXPORT
73   	SCIP_RETCODE SCIPcreateClock(
74   	   SCIP*                 scip,               /**< SCIP data structure */
75   	   SCIP_CLOCK**          clck                /**< pointer to clock timer */
76   	   );
77   	
78   	/** creates a clock counting the CPU user seconds
79   	 *
80   	 *  @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
81   	 *          SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
82   	 */
83   	SCIP_EXPORT
84   	SCIP_RETCODE SCIPcreateCPUClock(
85   	   SCIP*                 scip,               /**< SCIP data structure */
86   	   SCIP_CLOCK**          clck                /**< pointer to clock timer */
87   	   );
88   	
89   	/** creates a clock counting the wall clock seconds
90   	 *
91   	 *  @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
92   	 *          SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
93   	 */
94   	SCIP_EXPORT
95   	SCIP_RETCODE SCIPcreateWallClock(
96   	   SCIP*                 scip,               /**< SCIP data structure */
97   	   SCIP_CLOCK**          clck                /**< pointer to clock timer */
98   	   );
99   	
100  	/** frees a clock
101  	 *
102  	 *  @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
103  	 *          SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
104  	 */
105  	SCIP_EXPORT
106  	SCIP_RETCODE SCIPfreeClock(
107  	   SCIP*                 scip,               /**< SCIP data structure */
108  	   SCIP_CLOCK**          clck                /**< pointer to clock timer */
109  	   );
110  	
111  	/** resets the time measurement of a clock to zero and completely stops the clock
112  	 *
113  	 *  @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
114  	 *          SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
115  	 */
116  	SCIP_EXPORT
117  	SCIP_RETCODE SCIPresetClock(
118  	   SCIP*                 scip,               /**< SCIP data structure */
119  	   SCIP_CLOCK*           clck                /**< clock timer */
120  	   );
121  	
122  	/** starts the time measurement of a clock
123  	 *
124  	 *  @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
125  	 *          SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
126  	 */
127  	SCIP_EXPORT
128  	SCIP_RETCODE SCIPstartClock(
129  	   SCIP*                 scip,               /**< SCIP data structure */
130  	   SCIP_CLOCK*           clck                /**< clock timer */
131  	   );
132  	
133  	/** stops the time measurement of a clock
134  	 *
135  	 *  @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
136  	 *          SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
137  	 */
138  	SCIP_EXPORT
139  	SCIP_RETCODE SCIPstopClock(
140  	   SCIP*                 scip,               /**< SCIP data structure */
141  	   SCIP_CLOCK*           clck                /**< clock timer */
142  	   );
143  	
144  	/** enables or disables \p clck */
145  	SCIP_EXPORT
146  	void SCIPsetClockEnabled(
147  	   SCIP_CLOCK*           clck,               /**< the clock to be disabled/enabled */
148  	   SCIP_Bool             enable              /**< should the clock be enabled or disabled? */
149  	   );
150  	
151  	/** enables or disables all statistic clocks of SCIP concerning plugin statistics,
152  	 *  LP execution time, strong branching time, etc.
153  	 *
154  	 *  Method reads the value of the parameter timing/statistictiming. In order to disable statistic timing,
155  	 *  set the parameter to FALSE.
156  	 *
157  	 *  @note: The (pre-)solving time clocks which are relevant for the output during (pre-)solving
158  	 *         are not affected by this method
159  	 *
160  	 *  @see: For completely disabling all timing of SCIP, consider setting the parameter timing/enabled to FALSE
161  	 *
162  	 *  @pre This method can be called if SCIP is in one of the following stages:
163  	 *       - \ref SCIP_STAGE_PROBLEM
164  	 *       - \ref SCIP_STAGE_TRANSFORMING
165  	 *       - \ref SCIP_STAGE_TRANSFORMED
166  	 *       - \ref SCIP_STAGE_INITPRESOLVE
167  	 *       - \ref SCIP_STAGE_PRESOLVING
168  	 *       - \ref SCIP_STAGE_EXITPRESOLVE
169  	 *       - \ref SCIP_STAGE_PRESOLVED
170  	 *       - \ref SCIP_STAGE_INITSOLVE
171  	 *       - \ref SCIP_STAGE_SOLVING
172  	 *       - \ref SCIP_STAGE_SOLVED
173  	 *       - \ref SCIP_STAGE_EXITSOLVE
174  	 *       - \ref SCIP_STAGE_FREETRANS
175  	 *
176  	 *  See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
177  	 */
178  	SCIP_EXPORT
179  	SCIP_RETCODE SCIPenableOrDisableStatisticTiming(
180  	   SCIP*                 scip                /**< SCIP data structure */
181  	   );
182  	
183  	/** starts the current solving time
184  	 *
185  	 *  @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
186  	 *          SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
187  	 *
188  	 *  @pre This method can be called if SCIP is in one of the following stages:
189  	 *       - \ref SCIP_STAGE_PROBLEM
190  	 *       - \ref SCIP_STAGE_TRANSFORMING
191  	 *       - \ref SCIP_STAGE_TRANSFORMED
192  	 *       - \ref SCIP_STAGE_INITPRESOLVE
193  	 *       - \ref SCIP_STAGE_PRESOLVING
194  	 *       - \ref SCIP_STAGE_EXITPRESOLVE
195  	 *       - \ref SCIP_STAGE_PRESOLVED
196  	 *       - \ref SCIP_STAGE_INITSOLVE
197  	 *       - \ref SCIP_STAGE_SOLVING
198  	 *       - \ref SCIP_STAGE_SOLVED
199  	 *       - \ref SCIP_STAGE_EXITSOLVE
200  	 *       - \ref SCIP_STAGE_FREETRANS
201  	 *
202  	 *  See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
203  	 */
204  	SCIP_EXPORT
205  	SCIP_RETCODE SCIPstartSolvingTime(
206  	   SCIP*                 scip                /**< SCIP data structure */
207  	   );
208  	
209  	/** stops the current solving time in seconds
210  	 *
211  	 *  @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
212  	 *          SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
213  	 *
214  	 *  @pre This method can be called if SCIP is in one of the following stages:
215  	 *       - \ref SCIP_STAGE_PROBLEM
216  	 *       - \ref SCIP_STAGE_TRANSFORMING
217  	 *       - \ref SCIP_STAGE_TRANSFORMED
218  	 *       - \ref SCIP_STAGE_INITPRESOLVE
219  	 *       - \ref SCIP_STAGE_PRESOLVING
220  	 *       - \ref SCIP_STAGE_EXITPRESOLVE
221  	 *       - \ref SCIP_STAGE_PRESOLVED
222  	 *       - \ref SCIP_STAGE_INITSOLVE
223  	 *       - \ref SCIP_STAGE_SOLVING
224  	 *       - \ref SCIP_STAGE_SOLVED
225  	 *       - \ref SCIP_STAGE_EXITSOLVE
226  	 *       - \ref SCIP_STAGE_FREETRANS
227  	 *
228  	 *  See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
229  	 */
230  	SCIP_EXPORT
231  	SCIP_RETCODE SCIPstopSolvingTime(
232  	   SCIP*                 scip                /**< SCIP data structure */
233  	   );
234  	
235  	/** gets the measured time of a clock in seconds
236  	 *
237  	 *  @return the measured time of a clock in seconds.
238  	 */
239  	SCIP_EXPORT
240  	SCIP_Real SCIPgetClockTime(
241  	   SCIP*                 scip,               /**< SCIP data structure */
242  	   SCIP_CLOCK*           clck                /**< clock timer */
243  	   );
244  	
245  	/** sets the measured time of a clock to the given value in seconds
246  	 *
247  	 *  @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
248  	 *          SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
249  	 */
250  	SCIP_EXPORT
251  	SCIP_RETCODE SCIPsetClockTime(
252  	   SCIP*                 scip,               /**< SCIP data structure */
253  	   SCIP_CLOCK*           clck,               /**< clock timer */
254  	   SCIP_Real             sec                 /**< time in seconds to set the clock's timer to */
255  	   );
256  	
257  	/** gets the current total SCIP time in seconds, possibly accumulated over several problems.
258  	 *
259  	 *  @return the current total SCIP time in seconds, ie. the total time since the SCIP instance has been created
260  	 */
261  	SCIP_EXPORT
262  	SCIP_Real SCIPgetTotalTime(
263  	   SCIP*                 scip                /**< SCIP data structure */
264  	   );
265  	
266  	/** gets the current solving time in seconds
267  	 *
268  	 *  @return the current solving time in seconds.
269  	 *
270  	 *  @pre This method can be called if SCIP is in one of the following stages:
271  	 *       - \ref SCIP_STAGE_PROBLEM
272  	 *       - \ref SCIP_STAGE_TRANSFORMING
273  	 *       - \ref SCIP_STAGE_TRANSFORMED
274  	 *       - \ref SCIP_STAGE_INITPRESOLVE
275  	 *       - \ref SCIP_STAGE_PRESOLVING
276  	 *       - \ref SCIP_STAGE_EXITPRESOLVE
277  	 *       - \ref SCIP_STAGE_PRESOLVED
278  	 *       - \ref SCIP_STAGE_INITSOLVE
279  	 *       - \ref SCIP_STAGE_SOLVING
280  	 *       - \ref SCIP_STAGE_SOLVED
281  	 *
282  	 *  See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
283  	 */
284  	SCIP_EXPORT
285  	SCIP_Real SCIPgetSolvingTime(
286  	   SCIP*                 scip                /**< SCIP data structure */
287  	   );
288  	
289  	/** gets the current reading time in seconds
290  	 *
291  	 *  @return the current reading time in seconds.
292  	 *
293  	 *  @pre This method can be called if SCIP is in one of the following stages:
294  	 *       - \ref SCIP_STAGE_PROBLEM
295  	 *       - \ref SCIP_STAGE_TRANSFORMING
296  	 *       - \ref SCIP_STAGE_TRANSFORMED
297  	 *       - \ref SCIP_STAGE_INITPRESOLVE
298  	 *       - \ref SCIP_STAGE_PRESOLVING
299  	 *       - \ref SCIP_STAGE_EXITPRESOLVE
300  	 *       - \ref SCIP_STAGE_PRESOLVED
301  	 *       - \ref SCIP_STAGE_INITSOLVE
302  	 *       - \ref SCIP_STAGE_SOLVING
303  	 *       - \ref SCIP_STAGE_SOLVED
304  	 *
305  	 *  See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
306  	 */
307  	SCIP_EXPORT
308  	SCIP_Real SCIPgetReadingTime(
309  	   SCIP*                 scip                /**< SCIP data structure */
310  	   );
311  	
312  	/** gets the current presolving time in seconds
313  	 *
314  	 *  @return the current presolving time in seconds.
315  	 *
316  	 *  @pre This method can be called if SCIP is in one of the following stages:
317  	 *       - \ref SCIP_STAGE_INITPRESOLVE
318  	 *       - \ref SCIP_STAGE_PRESOLVING
319  	 *       - \ref SCIP_STAGE_EXITPRESOLVE
320  	 *       - \ref SCIP_STAGE_PRESOLVED
321  	 *       - \ref SCIP_STAGE_INITSOLVE
322  	 *       - \ref SCIP_STAGE_SOLVING
323  	 *       - \ref SCIP_STAGE_SOLVED
324  	 *
325  	 *  See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
326  	 */
327  	SCIP_EXPORT
328  	SCIP_Real SCIPgetPresolvingTime(
329  	   SCIP*                 scip                /**< SCIP data structure */
330  	   );
331  	
332  	/** gets the time need to solve the first LP in the root node
333  	 *
334  	 *  @return the solving time for the first LP in the root node in seconds.
335  	 *
336  	 *  @pre This method can be called if SCIP is in one of the following stages:
337  	 *       - \ref SCIP_STAGE_TRANSFORMING
338  	 *       - \ref SCIP_STAGE_TRANSFORMED
339  	 *       - \ref SCIP_STAGE_INITPRESOLVE
340  	 *       - \ref SCIP_STAGE_PRESOLVING
341  	 *       - \ref SCIP_STAGE_EXITPRESOLVE
342  	 *       - \ref SCIP_STAGE_PRESOLVED
343  	 *       - \ref SCIP_STAGE_INITSOLVE
344  	 *       - \ref SCIP_STAGE_SOLVING
345  	 *       - \ref SCIP_STAGE_SOLVED
346  	 *
347  	 *  See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
348  	 */
349  	SCIP_EXPORT
350  	SCIP_Real SCIPgetFirstLPTime(
351  	   SCIP*                 scip                /**< SCIP data structure */
352  	   );
353  	
354  	/**@} */
355  	
356  	#ifdef __cplusplus
357  	}
358  	#endif
359  	
360  	#endif
361