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   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  */
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 */
ObjPricer(SCIP * scip,const char * name,const char * desc,int priority,SCIP_Bool delay)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 */
~ObjPricer()89    virtual ~ObjPricer()
90    {
91       /* the macro SCIPfreeMemoryArray does not need the first argument: */
92       /*lint --e{64}*/
93       SCIPfreeMemoryArray(scip_, &scip_name_);
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     */
SCIP_DECL_PRICERFREE(scip_free)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     */
SCIP_DECL_PRICERINIT(scip_init)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     */
SCIP_DECL_PRICEREXIT(scip_exit)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     */
SCIP_DECL_PRICERINITSOL(scip_initsol)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     */
SCIP_DECL_PRICEREXITSOL(scip_exitsol)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     */
SCIP_DECL_PRICERFARKAS(scip_farkas)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