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