1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2 /*                                                                           */
3 /*                  This file is part of the program and library             */
4 /*         SCIP --- Solving Constraint Integer Programs                      */
5 /*                                                                           */
6 /*    Copyright (C) 2002-2021 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   objprop.h
17  * @brief  C++ wrapper for propagators
18  * @author Tobias Achterberg
19  */
20 
21 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
22 
23 #ifndef __SCIP_OBJPROP_H__
24 #define __SCIP_OBJPROP_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 propagators
35  *
36  *  This class defines the interface for propagators 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 PROP "Instructions for implementing a propagator"
40  *  - \ref PROPAGATORS "List of available propagators"
41  *  - \ref type_prop.h "Corresponding C interface"
42  */
43 class ObjProp : public ObjCloneable
44 {
45 public:
46    /*lint --e{1540}*/
47 
48    /** SCIP data structure */
49    SCIP* scip_;
50 
51    /** name of the propagator */
52    char* scip_name_;
53 
54    /** description of the propagator */
55    char* scip_desc_;
56 
57    /** default priority of the propagator */
58    const int scip_priority_;
59 
60    /** frequency for calling propagator */
61    const int scip_freq_;
62 
63    /** should propagator be delayed, if other propagators found reductions? */
64    const SCIP_Bool scip_delay_;
65 
66    /** positions in the node solving loop where propagator should be executed */
67    const SCIP_PROPTIMING scip_timingmask_;
68 
69    /** default presolving priority of the propagator */
70    const int scip_presol_priority_;
71 
72    /** frequency for calling propagator */
73    const int scip_presol_maxrounds_;
74 
75    /**< timing mask of the propagator's presolving method */
76    const SCIP_PRESOLTIMING scip_presol_timing_;
77 
78 
79    /** default constructor */
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)80    ObjProp(
81       SCIP*              scip,               /**< SCIP data structure */
82       const char*        name,               /**< name of propagator */
83       const char*        desc,               /**< description of propagator */
84       int                priority,           /**< priority of the propagator */
85       int                freq,               /**< frequency for calling propagator */
86       SCIP_Bool          delay,              /**< should propagator be delayed, if other propagators found reductions? */
87       SCIP_PROPTIMING    timingmask,         /**< positions in the node solving loop where propagator should be executed */
88       int                presolpriority,     /**< presolving priority of the propagator (>= 0: before, < 0: after constraint handlers) */
89       int                presolmaxrounds,    /**< maximal number of presolving rounds the propagator participates in (-1: no limit) */
90       SCIP_PRESOLTIMING  presoltiming        /**< timing mask of the propagator's presolving method */
91       )
92       : scip_(scip),
93         scip_name_(0),
94         scip_desc_(0),
95         scip_priority_(priority),
96         scip_freq_(freq),
97         scip_delay_(delay),
98         scip_timingmask_(timingmask),
99         scip_presol_priority_(presolpriority),
100         scip_presol_maxrounds_(presolmaxrounds),
101         scip_presol_timing_(presoltiming)
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 */
~ObjProp()109    virtual ~ObjProp()
110    {
111       /* the macro SCIPfreeMemoryArray does not need the first argument: */
112       /*lint --e{64}*/
113       SCIPfreeMemoryArray(scip_, &scip_name_);
114       SCIPfreeMemoryArray(scip_, &scip_desc_);
115    }
116 
117    /** destructor of propagator to free user data (called when SCIP is exiting)
118     *
119     *  @see SCIP_DECL_PROPFREE(x) in @ref type_prop.h
120     */
SCIP_DECL_PROPFREE(scip_free)121    virtual SCIP_DECL_PROPFREE(scip_free)
122    {  /*lint --e{715}*/
123       return SCIP_OKAY;
124    }
125 
126    /** initialization method of propagator (called after problem was transformed)
127     *
128     *  @see SCIP_DECL_PROPINIT(x) in @ref type_prop.h
129     */
SCIP_DECL_PROPINIT(scip_init)130    virtual SCIP_DECL_PROPINIT(scip_init)
131    {  /*lint --e{715}*/
132       return SCIP_OKAY;
133    }
134 
135    /** deinitialization method of propagator (called before transformed problem is freed)
136     *
137     *  @see SCIP_DECL_PROPEXIT(x) in @ref type_prop.h
138     */
SCIP_DECL_PROPEXIT(scip_exit)139    virtual SCIP_DECL_PROPEXIT(scip_exit)
140    {  /*lint --e{715}*/
141       return SCIP_OKAY;
142    }
143 
144    /** presolving initialization method of propagator (called when presolving is about to begin)
145     *
146     *  @see SCIP_DECL_PROPINITPRE(x) in @ref type_prop.h
147     */
SCIP_DECL_PROPINITPRE(scip_initpre)148    virtual SCIP_DECL_PROPINITPRE(scip_initpre)
149    {  /*lint --e{715}*/
150       return SCIP_OKAY;
151    }
152 
153    /** presolving deinitialization method of propagator (called after presolving has been finished)
154     *
155     *  @see SCIP_DECL_PROPEXITPRE(x) in @ref type_prop.h
156     */
SCIP_DECL_PROPEXITPRE(scip_exitpre)157    virtual SCIP_DECL_PROPEXITPRE(scip_exitpre)
158    {  /*lint --e{715}*/
159       return SCIP_OKAY;
160    }
161 
162    /** solving process initialization method of propagator (called when branch and bound process is about to begin)
163     *
164     *  @see SCIP_DECL_PROPINITSOL(x) in @ref type_prop.h
165     */
SCIP_DECL_PROPINITSOL(scip_initsol)166    virtual SCIP_DECL_PROPINITSOL(scip_initsol)
167    {  /*lint --e{715}*/
168       return SCIP_OKAY;
169    }
170 
171    /** solving process deinitialization method of propagator (called before branch and bound process data is freed)
172     *
173     *  @see SCIP_DECL_PROPEXITSOL(x) in @ref type_prop.h
174     */
SCIP_DECL_PROPEXITSOL(scip_exitsol)175    virtual SCIP_DECL_PROPEXITSOL(scip_exitsol)
176    {  /*lint --e{715}*/
177       return SCIP_OKAY;
178    }
179 
180    /** presolving method of propagator
181     *
182     *  @see SCIP_DECL_PROPPRESOL(x) in @ref type_prop.h
183     */
SCIP_DECL_PROPPRESOL(scip_presol)184    virtual SCIP_DECL_PROPPRESOL(scip_presol)
185    {  /*lint --e{715}*/
186       assert(result != NULL);
187       *result = SCIP_DIDNOTRUN;
188       return SCIP_OKAY;
189    }
190 
191    /** execution method of propagator
192     *
193     *  @see SCIP_DECL_PROPEXEC(x) in @ref type_prop.h
194     */
195    virtual SCIP_DECL_PROPEXEC(scip_exec) = 0;
196 
197    /** propagation conflict resolving method of propagator
198     *
199     *  @see SCIP_DECL_PROPRESPROP(x) in @ref type_prop.h
200     */
SCIP_DECL_PROPRESPROP(scip_resprop)201    virtual SCIP_DECL_PROPRESPROP(scip_resprop)
202    {  /*lint --e{715}*/
203 
204       /* set result pointer to indicate the propagation was not resolved */
205       assert(result != NULL);
206       (*result) = SCIP_DIDNOTFIND;
207 
208       return SCIP_OKAY;
209    }
210 };
211 
212 } /* namespace scip */
213 
214 
215 
216 /** creates the propagator for the given propagator object and includes it in SCIP
217  *
218  *  The method should be called in one of the following ways:
219  *
220  *   1. The user is resposible of deleting the object:
221  *       SCIP_CALL( SCIPcreate(&scip) );
222  *       ...
223  *       MyProp* myprop = new MyProp(...);
224  *       SCIP_CALL( SCIPincludeObjProp(scip, &myprop, FALSE) );
225  *       ...
226  *       SCIP_CALL( SCIPfree(&scip) );
227  *       delete myprop;    // delete prop AFTER SCIPfree() !
228  *
229  *   2. The object pointer is passed to SCIP and deleted by SCIP in the SCIPfree() call:
230  *       SCIP_CALL( SCIPcreate(&scip) );
231  *       ...
232  *       SCIP_CALL( SCIPincludeObjProp(scip, new MyProp(...), TRUE) );
233  *       ...
234  *       SCIP_CALL( SCIPfree(&scip) );  // destructor of MyProp is called here
235  */
236 SCIP_EXPORT
237 SCIP_RETCODE SCIPincludeObjProp(
238    SCIP*                 scip,               /**< SCIP data structure */
239    scip::ObjProp*        objprop,            /**< propagator object */
240    SCIP_Bool             deleteobject        /**< should the propagator object be deleted when propagator is freed? */
241    );
242 
243 /** returns the prop object of the given name, or 0 if not existing */
244 SCIP_EXPORT
245 scip::ObjProp* SCIPfindObjProp(
246    SCIP*                 scip,               /**< SCIP data structure */
247    const char*           name                /**< name of propagator */
248    );
249 
250 /** returns the prop object for the given propagator */
251 SCIP_EXPORT
252 scip::ObjProp* SCIPgetObjProp(
253    SCIP*                 scip,               /**< SCIP data structure */
254    SCIP_PROP*            prop                /**< propagator */
255    );
256 
257 #endif
258