1    	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2    	/*                                                                           */
3    	/*                  This file is part of the program and library             */
4    	/*         SCIP --- Solving Constraint Integer Programs                      */
5    	/*                                                                           */
6    	/*    Copyright (C) 2002-2022 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   objheur.h
17   	 * @brief  C++ wrapper for primal heuristics
18   	 * @author Tobias Achterberg
19   	 */
20   	
21   	/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
22   	
23   	#ifndef __SCIP_OBJHEUR_H__
24   	#define __SCIP_OBJHEUR_H__
25   	
26   	#include <cstring>
27   	
28   	#include "scip/scip.h"
29   	#include "objscip/objcloneable.h"
30   	
31   	namespace scip
32   	{
33   	
34   	/** @brief C++ wrapper for primal heuristics
35   	 *
36   	 *  This class defines the interface for primal heuristics implemented in C++. Note that there is a pure virtual
37   	 *  function (this function has to be implemented). This function is: scip_exec().
38   	 *
39   	 *  - \ref HEUR "Instructions for implementing a primal heuristic"
40   	 *  - \ref PRIMALHEURISTICS "List of available primal heuristics"
41   	 *  - \ref type_heur.h "Corresponding C interface"
42   	 */
(1) Event missing_assign: Class "scip::ObjHeur" owns resources that are freed in its destructor but has no user-written assignment operator.
(2) Event free_resource: The destructor frees member "scip_desc_". [details]
(3) Event free_resource: The destructor frees member "scip_name_". [details]
43   	class ObjHeur : public ObjCloneable
44   	{
45   	public:
46   	   /*lint --e{1540}*/
47   	
48   	   /** SCIP data structure */
49   	   SCIP* scip_;
50   	
51   	   /** name of the primal heuristic */
52   	   char* scip_name_;
53   	
54   	   /** description of the primal heuristic */
55   	   char* scip_desc_;
56   	
57   	   /** display character of primal heuristic */
58   	   const char scip_dispchar_;
59   	
60   	   /** default priority of the primal heuristic */
61   	   const int scip_priority_;
62   	
63   	   /** frequency for calling primal heuristic */
64   	   const int scip_freq_;
65   	
66   	   /** frequency offset for calling primal heuristic */
67   	   const int scip_freqofs_;
68   	
69   	   /** maximal depth level to call heuristic at (-1: no limit) */
70   	   const int scip_maxdepth_;
71   	
72   	   /** positions in the node solving loop where heuristic should be executed */
73   	   const SCIP_HEURTIMING scip_timingmask_;
74   	
75   	   /** does the heuristic use a secondary SCIP instance? */
76   	   const SCIP_Bool scip_usessubscip_;
77   	
78   	   /** default constructor */
79   	   ObjHeur(
80   	      SCIP*              scip,               /**< SCIP data structure */
81   	      const char*        name,               /**< name of primal heuristic */
82   	      const char*        desc,               /**< description of primal heuristic */
83   	      char               dispchar,           /**< display character of primal heuristic */
84   	      int                priority,           /**< priority of the primal heuristic */
85   	      int                freq,               /**< frequency for calling primal heuristic */
86   	      int                freqofs,            /**< frequency offset for calling primal heuristic */
87   	      int                maxdepth,           /**< maximal depth level to call heuristic at (-1: no limit) */
88   	      SCIP_HEURTIMING    timingmask,         /**< positions in the node solving loop where heuristic should be executed;
89   	                                              *   see definition of SCIP_HEURTIMING for possible values */
90   	      SCIP_Bool          usessubscip         /**< does the heuristic use a secondary SCIP instance? */
91   	      )
92   	      : scip_(scip),
93   	        scip_name_(0),
94   	        scip_desc_(0),
95   	        scip_dispchar_(dispchar),
96   	        scip_priority_(priority),
97   	        scip_freq_(freq),
98   	        scip_freqofs_(freqofs),
99   	        scip_maxdepth_(maxdepth),
100  	        scip_timingmask_(timingmask),
101  	        scip_usessubscip_(usessubscip)
102  	   {
103  	      /* the macro SCIPduplicateMemoryArray does not need the first argument: */
104  	      SCIP_CALL_ABORT( SCIPduplicateMemoryArray(scip_, &scip_name_, name, std::strlen(name)+1) );
105  	      SCIP_CALL_ABORT( SCIPduplicateMemoryArray(scip_, &scip_desc_, desc, std::strlen(desc)+1) );
106  	   }
107  	
108  	   /** destructor */
109  	   virtual ~ObjHeur()
110  	   {
111  	      /* the macro SCIPfreeMemoryArray does not need the first argument: */
112  	      /*lint --e{64}*/
(1) Event freed_arg: "BMSfreeMemory_call" frees parameter "this->scip_name_". [details]
113  	      SCIPfreeMemoryArray(scip_, &scip_name_);
(1) Event freed_arg: "BMSfreeMemory_call" frees parameter "this->scip_desc_". [details]
114  	      SCIPfreeMemoryArray(scip_, &scip_desc_);
115  	   }
116  	
117  	   /** destructor of primal heuristic to free user data (called when SCIP is exiting)
118  	    *
119  	    *  @see SCIP_DECL_HEURFREE(x) in @ref type_heur.h
120  	    */
121  	   virtual SCIP_DECL_HEURFREE(scip_free)
122  	   {  /*lint --e{715}*/
123  	      return SCIP_OKAY;
124  	   }
125  	
126  	   /** initialization method of primal heuristic (called after problem was transformed)
127  	    *
128  	    *  @see SCIP_DECL_HEURINIT(x) in @ref type_heur.h
129  	    */
130  	   virtual SCIP_DECL_HEURINIT(scip_init)
131  	   {  /*lint --e{715}*/
132  	      return SCIP_OKAY;
133  	   }
134  	
135  	   /** deinitialization method of primal heuristic (called before transformed problem is freed)
136  	    *
137  	    *  @see SCIP_DECL_HEUREXIT(x) in @ref type_heur.h
138  	    */
139  	   virtual SCIP_DECL_HEUREXIT(scip_exit)
140  	   {  /*lint --e{715}*/
141  	      return SCIP_OKAY;
142  	   }
143  	
144  	   /** solving process initialization method of primal heuristic (called when branch and bound process is about to begin)
145  	    *
146  	    *  @see SCIP_DECL_HEURINITSOL(x) in @ref type_heur.h
147  	    */
148  	   virtual SCIP_DECL_HEURINITSOL(scip_initsol)
149  	   {  /*lint --e{715}*/
150  	      return SCIP_OKAY;
151  	   }
152  	
153  	   /** solving process deinitialization method of primal heuristic (called before branch and bound process data is freed)
154  	    *
155  	    *  @see SCIP_DECL_HEUREXITSOL(x) in @ref type_heur.h
156  	    */
157  	   virtual SCIP_DECL_HEUREXITSOL(scip_exitsol)
158  	   {  /*lint --e{715}*/
159  	      return SCIP_OKAY;
160  	   }
161  	
162  	   /** execution method of primal heuristic
163  	    *
164  	    *  @see SCIP_DECL_HEUREXEC(x) in @ref type_heur.h
165  	    */
166  	   virtual SCIP_DECL_HEUREXEC(scip_exec) = 0;
167  	};
168  	
169  	} /* namespace scip */
170  	
171  	
172  	
173  	/** creates the primal heuristic for the given primal heuristic object and includes it in SCIP
174  	 *
175  	 *  The method should be called in one of the following ways:
176  	 *
177  	 *   1. The user is resposible of deleting the object:
178  	 *       SCIP_CALL( SCIPcreate(&scip) );
179  	 *       ...
180  	 *       MyHeur* myheur = new MyHeur(...);
181  	 *       SCIP_CALL( SCIPincludeObjHeur(scip, &myheur, FALSE) );
182  	 *       ...
183  	 *       SCIP_CALL( SCIPfree(&scip) );
184  	 *       delete myheur;    // delete heur AFTER SCIPfree() !
185  	 *
186  	 *   2. The object pointer is passed to SCIP and deleted by SCIP in the SCIPfree() call:
187  	 *       SCIP_CALL( SCIPcreate(&scip) );
188  	 *       ...
189  	 *       SCIP_CALL( SCIPincludeObjHeur(scip, new MyHeur(...), TRUE) );
190  	 *       ...
191  	 *       SCIP_CALL( SCIPfree(&scip) );  // destructor of MyHeur is called here
192  	 */
193  	SCIP_EXPORT
194  	SCIP_RETCODE SCIPincludeObjHeur(
195  	   SCIP*                 scip,               /**< SCIP data structure */
196  	   scip::ObjHeur*        objheur,            /**< primal heuristic object */
197  	   SCIP_Bool             deleteobject        /**< should the primal heuristic object be deleted when heuristic is freed? */
198  	   );
199  	
200  	/** returns the heur object of the given name, or 0 if not existing */
201  	SCIP_EXPORT
202  	scip::ObjHeur* SCIPfindObjHeur(
203  	   SCIP*                 scip,               /**< SCIP data structure */
204  	   const char*           name                /**< name of primal heuristic */
205  	   );
206  	
207  	/** returns the heur object for the given primal heuristic */
208  	SCIP_EXPORT
209  	scip::ObjHeur* SCIPgetObjHeur(
210  	   SCIP*                 scip,               /**< SCIP data structure */
211  	   SCIP_HEUR*            heur                /**< primal heuristic */
212  	   );
213  	
214  	#endif
215