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   objcutsel.h
17   	 * @brief  C++ wrapper for cut selectors
18   	 * @author Felipe Serrano
19   	 * @author Mark Turner
20   	 */
21   	
22   	/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
23   	
24   	#ifndef __SCIP_OBJCUTSEL_H__
25   	#define __SCIP_OBJCUTSEL_H__
26   	
27   	#include <cstring>
28   	
29   	#include "scip/scip.h"
30   	#include "objscip/objcloneable.h"
31   	
32   	namespace scip
33   	{
34   	
35   	/** @brief C++ wrapper for cut selectors
36   	 *
37   	 *  This class defines the interface for cut selectors implemented in C++.
38   	 *
39   	 *  - \ref CUTSEL "Instructions for implementing a cut selector"
40   	 *  - \ref CUTSELECTORS "List of available cut selectors"
41   	 *  - \ref type_cutsel.h "Corresponding C interface"
42   	 */
(1) Event missing_assign: Class "scip::ObjCutsel" 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 ObjCutsel : public ObjCloneable
44   	{
45   	public:
46   	   /*lint --e{1540}*/
47   	
48   	   /** SCIP data structure */
49   	   SCIP* scip_;
50   	
51   	   /** name of the cut selector */
52   	   char* scip_name_;
53   	
54   	   /** description of the cut selector */
55   	   char* scip_desc_;
56   	
57   	   /** priority of the cut selector */
58   	   const int scip_priority_;
59   	
60   	   /** default constructor */
61   	   ObjCutsel(
62   	      SCIP*              scip,               /**< SCIP data structure */
63   	      const char*        name,               /**< name of cut selector */
64   	      const char*        desc,               /**< description of cut selector */
65   	      int                priority            /**< priority of the cut */
66   	      )
67   	      : scip_(scip),
68   	        scip_name_(0),
69   	        scip_desc_(0),
70   	        scip_priority_(priority)
71   	   {
72   	      SCIP_CALL_ABORT( SCIPduplicateMemoryArray(scip_, &scip_name_, name, std::strlen(name)+1) );
73   	      SCIP_CALL_ABORT( SCIPduplicateMemoryArray(scip_, &scip_desc_, desc, std::strlen(desc)+1) );
74   	   }
75   	
76   	   /** destructor */
77   	   virtual ~ObjCutsel()
78   	   {
79   	      /*lint --e{64}*/
(1) Event freed_arg: "BMSfreeMemory_call" frees parameter "this->scip_name_". [details]
80   	      SCIPfreeMemoryArray(scip_, &scip_name_);
(1) Event freed_arg: "BMSfreeMemory_call" frees parameter "this->scip_desc_". [details]
81   	      SCIPfreeMemoryArray(scip_, &scip_desc_);
82   	   }
83   	
84   	   /** destructor of cut selector to free user data (called when SCIP is exiting)
85   	    *
86   	    *  @see SCIP_DECL_CUTSELFREE(x) in @ref type_cutsel.h
87   	    */
88   	   virtual SCIP_DECL_CUTSELFREE(scip_free)
89   	   {  /*lint --e{715}*/
90   	      return SCIP_OKAY;
91   	   }
92   	
93   	   /** initialization method of cut selector (called after problem was transformed)
94   	    *
95   	    *  @see SCIP_DECL_CUTSELINIT(x) in @ref type_cutsel.h
96   	    */
97   	   virtual SCIP_DECL_CUTSELINIT(scip_init)
98   	   {  /*lint --e{715}*/
99   	      return SCIP_OKAY;
100  	   }
101  	
102  	   /** deinitialization method of cut selector (called before transformed problem is freed)
103  	    *
104  	    *  @see SCIP_DECL_CUTSELEXIT(x) in @ref type_cutsel.h
105  	    */
106  	   virtual SCIP_DECL_CUTSELEXIT(scip_exit)
107  	   {  /*lint --e{715}*/
108  	      return SCIP_OKAY;
109  	   }
110  	
111  	   /** solving process initialization method of cut selector (called when branch and bound process is about to begin)
112  	    *
113  	    *  @see SCIP_DECL_CUTSELINITSOL(x) in @ref type_cutsel.h
114  	    */
115  	   virtual SCIP_DECL_CUTSELINITSOL(scip_initsol)
116  	   {  /*lint --e{715}*/
117  	      return SCIP_OKAY;
118  	   }
119  	
120  	   /** solving process deinitialization method of cut selector (called before branch and bound process data is freed)
121  	    *
122  	    *  @see SCIP_DECL_CUTSELEXITSOL(x) in @ref type_cutsel.h
123  	    */
124  	   virtual SCIP_DECL_CUTSELEXITSOL(scip_exitsol)
125  	   {  /*lint --e{715}*/
126  	      return SCIP_OKAY;
127  	   }
128  	
129  	   /** cut selection method of cut selector
130  	    *
131  	    *  @see SCIP_DECL_CUTSELSELECT(x) in @ref type_cutsel.h
132  	    */
133  	   virtual SCIP_DECL_CUTSELSELECT(scip_select) = 0;
134  	};
135  	
136  	} /* namespace scip */
137  	
138  	
139  	
140  	/** creates the cut selector for the given cut selector object and includes it in SCIP
141  	 *
142  	 *  The method should be called in one of the following ways:
143  	 *
144  	 *   1. The user is responsible for deleting the object:
145  	 *       SCIP_CALL( SCIPcreate(&scip) );
146  	 *       ...
147  	 *       MyCutsel* mycutsel = new MyCutsel(...);
148  	 *       SCIP_CALL( SCIPincludeObjCutsel(scip, &mycutsel, FALSE) );
149  	 *       ...
150  	 *       SCIP_CALL( SCIPfree(&scip) );
151  	 *       delete mycutsel;    // delete cutsel AFTER SCIPfree() !
152  	 *
153  	 *   2. The object pointer is passed to SCIP and deleted by SCIP in the SCIPfree() call:
154  	 *       SCIP_CALL( SCIPcreate(&scip) );
155  	 *       ...
156  	 *       SCIP_CALL( SCIPincludeObjCutsel(scip, new MyCutsel(...), TRUE) );
157  	 *       ...
158  	 *       SCIP_CALL( SCIPfree(&scip) );  // destructor of MyCutsel is called here
159  	 */
160  	SCIP_EXPORT
161  	SCIP_RETCODE SCIPincludeObjCutsel(
162  	   SCIP*                 scip,               /**< SCIP data structure */
163  	   scip::ObjCutsel*      objcutsel,          /**< cut selector object */
164  	   SCIP_Bool             deleteobject        /**< should the cut selector object be deleted when cut selector is freed? */
165  	   );
166  	
167  	/** returns the cutsel object of the given name, or 0 if not existing */
168  	SCIP_EXPORT
169  	scip::ObjCutsel* SCIPfindObjCutsel(
170  	   SCIP*                 scip,               /**< SCIP data structure */
171  	   const char*           name                /**< name of cut selector */
172  	   );
173  	
174  	/** returns the cutsel object for the given cut selector */
175  	SCIP_EXPORT
176  	scip::ObjCutsel* SCIPgetObjCutsel(
177  	   SCIP*                 scip,               /**< SCIP data structure */
178  	   SCIP_CUTSEL*          cutsel              /**< cut selector */
179  	   );
180  	
181  	#endif
182