1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
2  *
3  * This file is a part of LEMON, a generic C++ optimization library.
4  *
5  * Copyright (C) 2003-2013
6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
8  *
9  * Permission to use, modify and distribute this software is granted
10  * provided that this copyright notice appears in all copies. For
11  * precise terms see the accompanying LICENSE file.
12  *
13  * This software is provided "AS IS" with no warranty of any kind,
14  * express or implied, and with no claim as to its suitability for any
15  * purpose.
16  *
17  */
18 
19 #ifndef LEMON_LP_SKELETON_H
20 #define LEMON_LP_SKELETON_H
21 
22 #include <lemon/lp_base.h>
23 
24 ///\file
25 ///\brief Skeleton file to implement LP/MIP solver interfaces
26 ///
27 ///The classes in this file do nothing, but they can serve as skeletons when
28 ///implementing an interface to new solvers.
29 namespace lemon {
30 
31   ///A skeleton class to implement LP/MIP solver base interface
32 
33   ///This class does nothing, but it can serve as a skeleton when
34   ///implementing an interface to new solvers.
35   class SkeletonSolverBase : public virtual LpBase {
36     int col_num,row_num;
37 
38   protected:
39 
SkeletonSolverBase()40     SkeletonSolverBase()
41       : col_num(-1), row_num(-1) {}
42 
43     /// \e
44     virtual int _addCol();
45     /// \e
46     virtual int _addRow();
47     /// \e
48     virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
49     /// \e
50     virtual void _eraseCol(int i);
51     /// \e
52     virtual void _eraseRow(int i);
53 
54     /// \e
55     virtual void _getColName(int col, std::string& name) const;
56     /// \e
57     virtual void _setColName(int col, const std::string& name);
58     /// \e
59     virtual int _colByName(const std::string& name) const;
60 
61     /// \e
62     virtual void _getRowName(int row, std::string& name) const;
63     /// \e
64     virtual void _setRowName(int row, const std::string& name);
65     /// \e
66     virtual int _rowByName(const std::string& name) const;
67 
68     /// \e
69     virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e);
70     /// \e
71     virtual void _getRowCoeffs(int i, InsertIterator b) const;
72     /// \e
73     virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e);
74     /// \e
75     virtual void _getColCoeffs(int i, InsertIterator b) const;
76 
77     /// Set one element of the coefficient matrix
78     virtual void _setCoeff(int row, int col, Value value);
79 
80     /// Get one element of the coefficient matrix
81     virtual Value _getCoeff(int row, int col) const;
82 
83     /// The lower bound of a variable (column) have to be given by an
84     /// extended number of type Value, i.e. a finite number of type
85     /// Value or -\ref INF.
86     virtual void _setColLowerBound(int i, Value value);
87     /// \e
88 
89     /// The lower bound of a variable (column) is an
90     /// extended number of type Value, i.e. a finite number of type
91     /// Value or -\ref INF.
92     virtual Value _getColLowerBound(int i) const;
93 
94     /// The upper bound of a variable (column) have to be given by an
95     /// extended number of type Value, i.e. a finite number of type
96     /// Value or \ref INF.
97     virtual void _setColUpperBound(int i, Value value);
98     /// \e
99 
100     /// The upper bound of a variable (column) is an
101     /// extended number of type Value, i.e. a finite number of type
102     /// Value or \ref INF.
103     virtual Value _getColUpperBound(int i) const;
104 
105     /// The lower bound of a constraint (row) have to be given by an
106     /// extended number of type Value, i.e. a finite number of type
107     /// Value or -\ref INF.
108     virtual void _setRowLowerBound(int i, Value value);
109     /// \e
110 
111     /// The lower bound of a constraint (row) is an
112     /// extended number of type Value, i.e. a finite number of type
113     /// Value or -\ref INF.
114     virtual Value _getRowLowerBound(int i) const;
115 
116     /// The upper bound of a constraint (row) have to be given by an
117     /// extended number of type Value, i.e. a finite number of type
118     /// Value or \ref INF.
119     virtual void _setRowUpperBound(int i, Value value);
120     /// \e
121 
122     /// The upper bound of a constraint (row) is an
123     /// extended number of type Value, i.e. a finite number of type
124     /// Value or \ref INF.
125     virtual Value _getRowUpperBound(int i) const;
126 
127     /// \e
128     virtual void _setObjCoeffs(ExprIterator b, ExprIterator e);
129     /// \e
130     virtual void _getObjCoeffs(InsertIterator b) const;
131 
132     /// \e
133     virtual void _setObjCoeff(int i, Value obj_coef);
134     /// \e
135     virtual Value _getObjCoeff(int i) const;
136 
137     ///\e
138     virtual void _setSense(Sense);
139     ///\e
140     virtual Sense _getSense() const;
141 
142     ///\e
143     virtual void _clear();
144 
145     ///\e
146     virtual void _messageLevel(MessageLevel);
147 
148     ///\e
149     virtual void _write(std::string file, std::string format) const;
150 
151   };
152 
153   /// \brief Skeleton class for an LP solver interface
154   ///
155   ///This class does nothing, but it can serve as a skeleton when
156   ///implementing an interface to new solvers.
157 
158   ///\ingroup lp_group
159   class LpSkeleton : public LpSolver, public SkeletonSolverBase {
160   public:
161     ///\e
LpSkeleton()162     LpSkeleton() : LpSolver(), SkeletonSolverBase() {}
163     ///\e
164     virtual LpSkeleton* newSolver() const;
165     ///\e
166     virtual LpSkeleton* cloneSolver() const;
167   protected:
168 
169     ///\e
170     virtual SolveExitStatus _solve();
171 
172     ///\e
173     virtual Value _getPrimal(int i) const;
174     ///\e
175     virtual Value _getDual(int i) const;
176 
177     ///\e
178     virtual Value _getPrimalValue() const;
179 
180     ///\e
181     virtual Value _getPrimalRay(int i) const;
182     ///\e
183     virtual Value _getDualRay(int i) const;
184 
185     ///\e
186     virtual ProblemType _getPrimalType() const;
187     ///\e
188     virtual ProblemType _getDualType() const;
189 
190     ///\e
191     virtual VarStatus _getColStatus(int i) const;
192     ///\e
193     virtual VarStatus _getRowStatus(int i) const;
194 
195     ///\e
196     virtual const char* _solverName() const;
197 
198   };
199 
200   /// \brief Skeleton class for a MIP solver interface
201   ///
202   ///This class does nothing, but it can serve as a skeleton when
203   ///implementing an interface to new solvers.
204   ///\ingroup lp_group
205   class MipSkeleton : public MipSolver, public SkeletonSolverBase {
206   public:
207     ///\e
MipSkeleton()208     MipSkeleton() : MipSolver(), SkeletonSolverBase() {}
209     ///\e
210     virtual MipSkeleton* newSolver() const;
211     ///\e
212     virtual MipSkeleton* cloneSolver() const;
213 
214   protected:
215     ///\e
216     virtual SolveExitStatus _solve();
217 
218     ///\e
219     virtual Value _getSol(int i) const;
220 
221     ///\e
222     virtual Value _getSolValue() const;
223 
224     ///\e
225     virtual ProblemType _getType() const;
226 
227     ///\e
228     virtual const char* _solverName() const;
229 
230   };
231 
232 } //namespace lemon
233 
234 #endif
235