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   objpricer.h
17   	 * @brief  C++ wrapper for variable pricers
18   	 * @author Tobias Achterberg
19   	 */
20   	
21   	/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
22   	
23   	#ifndef __SCIP_OBJPRICER_H__
24   	#define __SCIP_OBJPRICER_H__
25   	
26   	#include <cstring>
27   	
28   	#include "scip/scip.h"
29   	#include "objscip/objprobcloneable.h"
30   	
31   	namespace scip
32   	{
33   	
34   	/** @brief C++ wrapper for variable pricer
35   	 *
36   	 *  This class defines the interface for variable pricer implemented in C++. Note that there is a pure virtual
37   	 *  function (this function has to be implemented). This function is: scip_redcost().
38   	 *
39   	 *  - \ref PRICER "Instructions for implementing a variable pricer"
40   	 *  - \ref type_pricer.h "Corresponding C interface"
41   	 */
(1) Event missing_copy_ctor: Class "scip::ObjPricer" owns resources that are freed in its destructor but has no user-written copy constructor.
(2) Event free_resource: The destructor frees member "scip_desc_". [details]
(3) Event free_resource: The destructor frees member "scip_name_". [details]
42   	class ObjPricer : public ObjProbCloneable
43   	{
44   	public:
45   	   /*lint --e{1540}*/
46   	
47   	   /** SCIP data structure */
48   	   SCIP* scip_;
49   	
50   	   /** name of the variable pricer */
51   	   char* scip_name_;
52   	
53   	   /** description of the variable pricer */
54   	   char* scip_desc_;
55   	
56   	   /** default priority of the variable pricer */
57   	   const int scip_priority_;
58   	
59   	   /** should the pricer be delayed until no other pricers or already existing problem variables with negative reduced
60   	    *  costs are found?
61   	    */
62   	   const SCIP_Bool scip_delay_;
63   	
64   	   /** default constructor */
65   	   ObjPricer(
66   	      SCIP*              scip,               /**< SCIP data structure */
67   	      const char*        name,               /**< name of variable pricer */
68   	      const char*        desc,               /**< description of variable pricer */
69   	      int                priority,           /**< priority of the variable pricer */
70   	      SCIP_Bool          delay               /**< should the pricer be delayed until no other pricers or already existing
71   	                                              *   problem variables with negative reduced costs are found?
72   	                                              *   if this is set to FALSE it may happen that the pricer produces columns
73   	                                              *   that already exist in the problem (which are also priced in by the
74   	                                              *   default problem variable pricing in the same round)
75   	                                              */
76   	      )
77   	      : scip_(scip),
78   	        scip_name_(0),
79   	        scip_desc_(0),
80   	        scip_priority_(priority),
81   	        scip_delay_(delay)
82   	   {
83   	      /* the macro SCIPduplicateMemoryArray does not need the first argument: */
84   	      SCIP_CALL_ABORT( SCIPduplicateMemoryArray(scip_, &scip_name_, name, std::strlen(name)+1) );
85   	      SCIP_CALL_ABORT( SCIPduplicateMemoryArray(scip_, &scip_desc_, desc, std::strlen(desc)+1) );
86   	   }
87   	
88   	   /** destructor */
89   	   virtual ~ObjPricer()
90   	   {
91   	      /* the macro SCIPfreeMemoryArray does not need the first argument: */
92   	      /*lint --e{64}*/
(1) Event freed_arg: "BMSfreeMemory_call" frees parameter "this->scip_name_". [details]
93   	      SCIPfreeMemoryArray(scip_, &scip_name_);
(1) Event freed_arg: "BMSfreeMemory_call" frees parameter "this->scip_desc_". [details]
94   	      SCIPfreeMemoryArray(scip_, &scip_desc_);
95   	   }
96   	
97   	   /** destructor of variable pricer to free user data (called when SCIP is exiting)
98   	    *
99   	    *  @see SCIP_DECL_PRICERFREE(x) in @ref type_pricer.h
100  	    */
101  	   virtual SCIP_DECL_PRICERFREE(scip_free)
102  	   {  /*lint --e{715}*/
103  	      return SCIP_OKAY;
104  	   }
105  	
106  	   /** initialization method of variable pricer (called after problem was transformed)
107  	    *
108  	    *  @see SCIP_DECL_PRICERINIT(x) in @ref type_pricer.h
109  	    */
110  	   virtual SCIP_DECL_PRICERINIT(scip_init)
111  	   {  /*lint --e{715}*/
112  	      return SCIP_OKAY;
113  	   }
114  	
115  	   /** deinitialization method of variable pricer (called before transformed problem is freed)
116  	    *
117  	    *  @see SCIP_DECL_PRICEREXIT(x) in @ref type_pricer.h
118  	    */
119  	   virtual SCIP_DECL_PRICEREXIT(scip_exit)
120  	   {  /*lint --e{715}*/
121  	      return SCIP_OKAY;
122  	   }
123  	
124  	   /** solving process initialization method of variable pricer (called when branch and bound process is about to begin)
125  	    *
126  	    *  @see SCIP_DECL_PRICERINITSOL(x) in @ref type_pricer.h
127  	    */
128  	   virtual SCIP_DECL_PRICERINITSOL(scip_initsol)
129  	   {  /*lint --e{715}*/
130  	      return SCIP_OKAY;
131  	   }
132  	
133  	   /** solving process deinitialization method of variable pricer (called before branch and bound process data is freed)
134  	    *
135  	    *  @see SCIP_DECL_PRICEREXITSOL(x) in @ref type_pricer.h
136  	    */
137  	   virtual SCIP_DECL_PRICEREXITSOL(scip_exitsol)
138  	   {  /*lint --e{715}*/
139  	      return SCIP_OKAY;
140  	   }
141  	
142  	   /** reduced cost pricing method of variable pricer for feasible LPs
143  	    *
144  	    *  @see SCIP_DECL_PRICERREDCOST(x) in @ref type_pricer.h
145  	    */
146  	   virtual SCIP_DECL_PRICERREDCOST(scip_redcost) = 0;
147  	
148  	   /** farkas pricing method of variable pricer for infeasible LPs
149  	    *
150  	    *  @see SCIP_DECL_PRICERFARKAS(x) in @ref type_pricer.h
151  	    */
152  	   virtual SCIP_DECL_PRICERFARKAS(scip_farkas)
153  	   {  /*lint --e{715}*/
154  	      return SCIP_OKAY;
155  	   }
156  	};
157  	
158  	} /* namespace scip */
159  	
160  	
161  	
162  	/** creates the variable pricer for the given variable pricer object and includes it in SCIP
163  	 *
164  	 *  The method should be called in one of the following ways:
165  	 *
166  	 *   1. The user is resposible of deleting the object:
167  	 *       SCIP_CALL( SCIPcreate(&scip) );
168  	 *       ...
169  	 *       MyPricer* mypricer = new MyPricer(...);
170  	 *       SCIP_CALL( SCIPincludeObjPricer(scip, &mypricer, FALSE) );
171  	 *       ...
172  	 *       SCIP_CALL( SCIPfree(&scip) );
173  	 *       delete mypricer;    // delete pricer AFTER SCIPfree() !
174  	 *
175  	 *   2. The object pointer is passed to SCIP and deleted by SCIP in the SCIPfree() call:
176  	 *       SCIP_CALL( SCIPcreate(&scip) );
177  	 *       ...
178  	 *       SCIP_CALL( SCIPincludeObjPricer(scip, new MyPricer(...), TRUE) );
179  	 *       ...
180  	 *       SCIP_CALL( SCIPfree(&scip) );  // destructor of MyPricer is called here
181  	 */
182  	SCIP_EXPORT
183  	SCIP_RETCODE SCIPincludeObjPricer(
184  	   SCIP*                 scip,               /**< SCIP data structure */
185  	   scip::ObjPricer*      objpricer,          /**< variable pricer object */
186  	   SCIP_Bool             deleteobject        /**< should the pricer object be deleted when pricer is freed? */
187  	   );
188  	
189  	/** returns the variable pricer object of the given name, or 0 if not existing */
190  	SCIP_EXPORT
191  	scip::ObjPricer* SCIPfindObjPricer(
192  	   SCIP*                 scip,               /**< SCIP data structure */
193  	   const char*           name                /**< name of variable pricer */
194  	   );
195  	
196  	/** returns the variable pricer object for the given pricer */
197  	SCIP_EXPORT
198  	scip::ObjPricer* SCIPgetObjPricer(
199  	   SCIP*                 scip,               /**< SCIP data structure */
200  	   SCIP_PRICER*          pricer              /**< pricer */
201  	   );
202  	
203  	#endif
204