Scippy

SCIP

Solving Constraint Integer Programs

objprop.h
Go to the documentation of this file.
1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2/* */
3/* This file is part of the program and library */
4/* SCIP --- Solving Constraint Integer Programs */
5/* */
6/* Copyright (c) 2002-2024 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 objprop.h
26 * @brief C++ wrapper for propagators
27 * @author Tobias Achterberg
28 */
29
30/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
31
32#ifndef __SCIP_OBJPROP_H__
33#define __SCIP_OBJPROP_H__
34
35#include <cstring>
36#include <utility>
37
38#include "scip/scip.h"
40
41namespace scip
42{
43
44/** @brief C++ wrapper for propagators
45 *
46 * This class defines the interface for propagators implemented in C++. Note that there is a pure virtual
47 * function (this function has to be implemented). This function is: scip_exec().
48 *
49 * - \ref PROP "Instructions for implementing a propagator"
50 * - \ref PROPAGATORS "List of available propagators"
51 * - \ref type_prop.h "Corresponding C interface"
52 */
53class ObjProp : public ObjCloneable
54{
55public:
56 /*lint --e{1540}*/
57
58 /** SCIP data structure */
60
61 /** name of the propagator */
63
64 /** description of the propagator */
66
67 /** default priority of the propagator */
68 const int scip_priority_;
69
70 /** frequency for calling propagator */
71 const int scip_freq_;
72
73 /** should propagator be delayed, if other propagators found reductions? */
75
76 /** positions in the node solving loop where propagator should be executed */
78
79 /** default presolving priority of the propagator */
81
82 /** frequency for calling propagator */
84
85 /**< timing mask of the propagator's presolving method */
87
88
89 /** default constructor */
91 SCIP* scip, /**< SCIP data structure */
92 const char* name, /**< name of propagator */
93 const char* desc, /**< description of propagator */
94 int priority, /**< priority of the propagator */
95 int freq, /**< frequency for calling propagator */
96 SCIP_Bool delay, /**< should propagator be delayed, if other propagators found reductions? */
97 SCIP_PROPTIMING timingmask, /**< positions in the node solving loop where propagator should be executed */
98 int presolpriority, /**< presolving priority of the propagator (>= 0: before, < 0: after constraint handlers) */
99 int presolmaxrounds, /**< maximal number of presolving rounds the propagator participates in (-1: no limit) */
100 SCIP_PRESOLTIMING presoltiming /**< timing mask of the propagator's presolving method */
101 )
102 : scip_(scip),
103 scip_name_(0),
104 scip_desc_(0),
105 scip_priority_(priority),
106 scip_freq_(freq),
107 scip_delay_(delay),
108 scip_timingmask_(timingmask),
109 scip_presol_priority_(presolpriority),
110 scip_presol_maxrounds_(presolmaxrounds),
111 scip_presol_timing_(presoltiming)
112 {
113 /* the macro SCIPduplicateMemoryArray does not need the first argument: */
114 SCIP_CALL_ABORT( SCIPduplicateMemoryArray(scip_, &scip_name_, name, std::strlen(name)+1) );
115 SCIP_CALL_ABORT( SCIPduplicateMemoryArray(scip_, &scip_desc_, desc, std::strlen(desc)+1) );
116 }
117
118 /** copy constructor */
119 ObjProp(const ObjProp& o)
122 {
123 }
124
125 /** move constructor */
127 : scip_(o.scip_),
128 scip_name_(0),
129 scip_desc_(0),
137 {
138 std::swap(scip_name_, o.scip_name_);
139 std::swap(scip_desc_, o.scip_desc_);
140 }
141
142 /** destructor */
143 virtual ~ObjProp()
144 {
145 /* the macro SCIPfreeMemoryArray does not need the first argument: */
146 /*lint --e{64}*/
149 }
150
151 /** assignment of polymorphic classes causes slicing and is therefore disabled. */
152 ObjProp& operator=(const ObjProp& o) = delete;
153
154 /** assignment of polymorphic classes causes slicing and is therefore disabled. */
155 ObjProp& operator=(ObjProp&& o) = delete;
156
157 /** destructor of propagator to free user data (called when SCIP is exiting)
158 *
159 * @see SCIP_DECL_PROPFREE(x) in @ref type_prop.h
160 */
161 virtual SCIP_DECL_PROPFREE(scip_free)
162 { /*lint --e{715}*/
163 return SCIP_OKAY;
164 }
165
166 /** initialization method of propagator (called after problem was transformed)
167 *
168 * @see SCIP_DECL_PROPINIT(x) in @ref type_prop.h
169 */
170 virtual SCIP_DECL_PROPINIT(scip_init)
171 { /*lint --e{715}*/
172 return SCIP_OKAY;
173 }
174
175 /** deinitialization method of propagator (called before transformed problem is freed)
176 *
177 * @see SCIP_DECL_PROPEXIT(x) in @ref type_prop.h
178 */
179 virtual SCIP_DECL_PROPEXIT(scip_exit)
180 { /*lint --e{715}*/
181 return SCIP_OKAY;
182 }
183
184 /** presolving initialization method of propagator (called when presolving is about to begin)
185 *
186 * @see SCIP_DECL_PROPINITPRE(x) in @ref type_prop.h
187 */
188 virtual SCIP_DECL_PROPINITPRE(scip_initpre)
189 { /*lint --e{715}*/
190 return SCIP_OKAY;
191 }
192
193 /** presolving deinitialization method of propagator (called after presolving has been finished)
194 *
195 * @see SCIP_DECL_PROPEXITPRE(x) in @ref type_prop.h
196 */
197 virtual SCIP_DECL_PROPEXITPRE(scip_exitpre)
198 { /*lint --e{715}*/
199 return SCIP_OKAY;
200 }
201
202 /** solving process initialization method of propagator (called when branch and bound process is about to begin)
203 *
204 * @see SCIP_DECL_PROPINITSOL(x) in @ref type_prop.h
205 */
206 virtual SCIP_DECL_PROPINITSOL(scip_initsol)
207 { /*lint --e{715}*/
208 return SCIP_OKAY;
209 }
210
211 /** solving process deinitialization method of propagator (called before branch and bound process data is freed)
212 *
213 * @see SCIP_DECL_PROPEXITSOL(x) in @ref type_prop.h
214 */
215 virtual SCIP_DECL_PROPEXITSOL(scip_exitsol)
216 { /*lint --e{715}*/
217 return SCIP_OKAY;
218 }
219
220 /** presolving method of propagator
221 *
222 * @see SCIP_DECL_PROPPRESOL(x) in @ref type_prop.h
223 */
224 virtual SCIP_DECL_PROPPRESOL(scip_presol)
225 { /*lint --e{715}*/
226 assert(result != NULL);
227 *result = SCIP_DIDNOTRUN;
228 return SCIP_OKAY;
229 }
230
231 /** execution method of propagator
232 *
233 * @see SCIP_DECL_PROPEXEC(x) in @ref type_prop.h
234 */
235 virtual SCIP_DECL_PROPEXEC(scip_exec) = 0;
236
237 /** propagation conflict resolving method of propagator
238 *
239 * @see SCIP_DECL_PROPRESPROP(x) in @ref type_prop.h
240 */
241 virtual SCIP_DECL_PROPRESPROP(scip_resprop)
242 { /*lint --e{715}*/
243
244 /* set result pointer to indicate the propagation was not resolved */
245 assert(result != NULL);
246 (*result) = SCIP_DIDNOTFIND;
247
248 return SCIP_OKAY;
249 }
250};
251
252} /* namespace scip */
253
254
255
256/** creates the propagator for the given propagator object and includes it in SCIP
257 *
258 * The method should be called in one of the following ways:
259 *
260 * 1. The user is resposible of deleting the object:
261 * SCIP_CALL( SCIPcreate(&scip) );
262 * ...
263 * MyProp* myprop = new MyProp(...);
264 * SCIP_CALL( SCIPincludeObjProp(scip, &myprop, FALSE) );
265 * ...
266 * SCIP_CALL( SCIPfree(&scip) );
267 * delete myprop; // delete prop AFTER SCIPfree() !
268 *
269 * 2. The object pointer is passed to SCIP and deleted by SCIP in the SCIPfree() call:
270 * SCIP_CALL( SCIPcreate(&scip) );
271 * ...
272 * SCIP_CALL( SCIPincludeObjProp(scip, new MyProp(...), TRUE) );
273 * ...
274 * SCIP_CALL( SCIPfree(&scip) ); // destructor of MyProp is called here
275 */
276SCIP_EXPORT
278 SCIP* scip, /**< SCIP data structure */
279 scip::ObjProp* objprop, /**< propagator object */
280 SCIP_Bool deleteobject /**< should the propagator object be deleted when propagator is freed? */
281 );
282
283/** returns the prop object of the given name, or 0 if not existing */
284SCIP_EXPORT
286 SCIP* scip, /**< SCIP data structure */
287 const char* name /**< name of propagator */
288 );
289
290/** returns the prop object for the given propagator */
291SCIP_EXPORT
293 SCIP* scip, /**< SCIP data structure */
294 SCIP_PROP* prop /**< propagator */
295 );
296
297#endif
C++ wrapper for propagators.
Definition: objprop.h:54
const int scip_priority_
Definition: objprop.h:68
const SCIP_Bool scip_delay_
Definition: objprop.h:74
ObjProp & operator=(const ObjProp &o)=delete
virtual SCIP_DECL_PROPEXIT(scip_exit)
Definition: objprop.h:179
virtual SCIP_DECL_PROPEXITSOL(scip_exitsol)
Definition: objprop.h:215
virtual SCIP_DECL_PROPINIT(scip_init)
Definition: objprop.h:170
virtual SCIP_DECL_PROPRESPROP(scip_resprop)
Definition: objprop.h:241
char * scip_desc_
Definition: objprop.h:65
const int scip_presol_maxrounds_
Definition: objprop.h:83
SCIP * scip_
Definition: objprop.h:59
ObjProp & operator=(ObjProp &&o)=delete
virtual SCIP_DECL_PROPINITSOL(scip_initsol)
Definition: objprop.h:206
virtual ~ObjProp()
Definition: objprop.h:143
const int scip_freq_
Definition: objprop.h:71
virtual SCIP_DECL_PROPEXITPRE(scip_exitpre)
Definition: objprop.h:197
virtual SCIP_DECL_PROPEXEC(scip_exec)=0
const SCIP_PROPTIMING scip_timingmask_
Definition: objprop.h:77
ObjProp(const ObjProp &o)
Definition: objprop.h:119
const SCIP_PRESOLTIMING scip_presol_timing_
Definition: objprop.h:86
virtual SCIP_DECL_PROPINITPRE(scip_initpre)
Definition: objprop.h:188
const int scip_presol_priority_
Definition: objprop.h:80
char * scip_name_
Definition: objprop.h:62
ObjProp(SCIP *scip, const char *name, const char *desc, int priority, int freq, SCIP_Bool delay, SCIP_PROPTIMING timingmask, int presolpriority, int presolmaxrounds, SCIP_PRESOLTIMING presoltiming)
Definition: objprop.h:90
virtual SCIP_DECL_PROPFREE(scip_free)
Definition: objprop.h:161
virtual SCIP_DECL_PROPPRESOL(scip_presol)
Definition: objprop.h:224
ObjProp(ObjProp &&o)
Definition: objprop.h:126
#define NULL
Definition: def.h:266
#define SCIP_Bool
Definition: def.h:91
#define SCIP_CALL_ABORT(x)
Definition: def.h:352
#define SCIPduplicateMemoryArray(scip, ptr, source, num)
Definition: scip_mem.h:76
#define SCIPfreeMemoryArray(scip, ptr)
Definition: scip_mem.h:80
definition of base class for all clonable classes
SCIP_RETCODE SCIPincludeObjProp(SCIP *scip, scip::ObjProp *objprop, SCIP_Bool deleteobject)
Definition: objprop.cpp:276
scip::ObjProp * SCIPgetObjProp(SCIP *scip, SCIP_PROP *prop)
Definition: objprop.cpp:323
scip::ObjProp * SCIPfindObjProp(SCIP *scip, const char *name)
Definition: objprop.cpp:304
SCIP callable library.
Definition of base class for all clonable classes.
Definition: objcloneable.h:48
@ SCIP_DIDNOTRUN
Definition: type_result.h:42
@ SCIP_DIDNOTFIND
Definition: type_result.h:44
@ SCIP_OKAY
Definition: type_retcode.h:42
enum SCIP_Retcode SCIP_RETCODE
Definition: type_retcode.h:63
unsigned int SCIP_PROPTIMING
Definition: type_timing.h:74
unsigned int SCIP_PRESOLTIMING
Definition: type_timing.h:61