Scippy

SoPlex

Sequential object-oriented simPlex

lprowbase.h
Go to the documentation of this file.
1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2/* */
3/* This file is part of the class library */
4/* SoPlex --- the Sequential object-oriented simPlex. */
5/* */
6/* Copyright (c) 1996-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 SoPlex; see the file LICENSE. If not email to soplex@zib.de. */
22/* */
23/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
24
25/**@file lprowbase.h
26 * @brief (In)equality for LPs.
27 */
28#ifndef _LPROWBASE_H_
29#define _LPROWBASE_H_
30
31#include <assert.h>
32
33#include "soplex/spxdefines.h"
34#include "soplex/basevectors.h"
35
36namespace soplex
37{
38/**@brief (In)equality for LPs.
39 * @ingroup Algo
40 *
41 * Class LPRowBase provides constraints for linear programs in the form \f[ l \le a^Tx \le r, \f] where \em a is a
42 * DSVector. \em l is referred to as %left hand side, \em r as %right hand side and \em a as \em row \em vector or the
43 * constraint vector. \em l and \em r may also take values \f$\pm\f$ R(infinity). This static member is predefined, but
44 * may be overridden to meet the needs of the LP solver to be used.
45 *
46 * LPRowBases allow to specify regular inequalities of the form \f[ a^Tx \sim \alpha, \f] where \f$\sim\f$ can take any
47 * value of \f$\le, =, \ge\f$, by setting rhs and lhs to the same value or setting one of them to \f$\infty\f$.
48 *
49 * Since constraints in the regular form occur often, LPRowBases offers methods type() and value() for retreiving
50 * \f$\sim\f$ and \f$\alpha\f$ of an LPRowBase in this form, respectively. Also, a constructor for LPRowBases given in
51 * regular form is provided.
52 */
53template < class R >
55{
56 template < class S > friend class LPRowBase;
57
58private:
59
60 // ------------------------------------------------------------------------------------------------------------------
61 /**@name Data */
62 ///@{
63
64 R left; ///< left-hand side of the constraint
65 R right; ///< right-hand side of the constraint
66 R object; ///< objective coefficient of corresponding slack variable s = vec times primal
67 DSVectorBase<R> vec; ///< the row vector
68
69 ///@}
70
71public:
72
73 // ------------------------------------------------------------------------------------------------------------------
74 /**@name Types */
75 ///@{
76
77 /// (In)Equality type of an LP row.
78 /** #LPRowBase%s may be of one of the following Types. This datatype may be used for constructing new #LPRowBase%s in the
79 * regular form.
80 */
81 enum Type
82 {
83 LESS_EQUAL, ///< \f$a^Tx \le \alpha\f$.
84 EQUAL, ///< \f$a^Tx = \alpha\f$.
85 GREATER_EQUAL, ///< \f$a^Tx \ge \alpha\f$.
86 RANGE ///< \f$\lambda \le a^Tx \le \rho\f$.
87 };
88
89 ///@}
90
91 // ------------------------------------------------------------------------------------------------------------------
92 /**@name Construction / destruction */
93 ///@{
94
95 /// Constructs LPRowBase with a vector ready to hold \p defDim nonzeros.
96 explicit LPRowBase(int defDim = 0)
97 : left(0), right(R(infinity)), object(0), vec(defDim)
98 {
99 assert(isConsistent());
100 }
101
102 /// Assignment operator.
104 {
105 if(this != &row)
106 {
107 left = row.left;
108 right = row.right;
109 object = row.object;
110 vec = row.vec;
111 }
112
113 assert(isConsistent());
114 }
115
116 /// Copy constructor.
118 : left(row.left), right(row.right), object(row.object), vec(row.vec)
119 {
120 assert(isConsistent());
121 }
122
123 /// Copy constructor.
124 template < class S >
126 : left(row.left), right(row.right), object(row.object), vec(row.vec)
127 {
128 assert(isConsistent());
129 }
130
131 /// Constructs LPRowBase with the given left-hand side, right-hand side and rowVector.
132 LPRowBase(const R& p_lhs, const SVectorBase<R>& p_rowVector, const R& p_rhs, const R& p_obj = 0)
133 : left(p_lhs), right(p_rhs), object(p_obj), vec(p_rowVector)
134 {
135 assert(isConsistent());
136 }
137
138 /// Constructs LPRowBase from passed \p rowVector, \p type and \p value.
139 LPRowBase(const SVectorBase<R>& p_rowVector, Type p_type, const R& p_value, const R& p_obj = 0)
140 : object(p_obj), vec(p_rowVector)
141 {
142 switch(p_type)
143 {
144 case LESS_EQUAL:
145 left = R(-infinity);
146 right = p_value;
147 break;
148
149 case EQUAL:
150 left = p_value;
151 right = p_value;
152 break;
153
154 case GREATER_EQUAL:
155 left = p_value;
156 right = R(infinity);
157 break;
158
159 default:
160 throw SPxInternalCodeException("XLPROW03 This should never happen.");
161 }
162
163 assert(isConsistent());
164 }
165
166 /// Destructor.
168 {}
169
170 ///@}
171
172 // ------------------------------------------------------------------------------------------------------------------
173 /**@name Access / modification */
174 ///@{
175
176 /// Gets type of row.
177 Type type() const
178 {
179 if(rhs() >= R(infinity))
180 return GREATER_EQUAL;
181
182 if(lhs() <= R(-infinity))
183 return LESS_EQUAL;
184
185 if(lhs() == rhs())
186 return EQUAL;
187
188 return RANGE;
189 }
190
191 /// Sets type of (in)equality.
192 void setType(Type p_type)
193 {
194 switch(p_type)
195 {
196 case LESS_EQUAL:
197 left = R(-infinity);
198 break;
199
200 case EQUAL:
201 if(lhs() > R(-infinity))
202 right = lhs();
203 else
204 left = rhs();
205
206 break;
207
208 case GREATER_EQUAL:
209 right = R(infinity);
210 break;
211
212 case RANGE:
213 SPX_MSG_ERROR(std::cerr << "ELPROW01 RANGE not supported in LPRow::setType()"
214 << std::endl;)
215 throw SPxInternalCodeException("XLPROW01 This should never happen.");
216
217 default:
218 throw SPxInternalCodeException("XLPROW02 This should never happen.");
219 }
220 }
221
222 /// Right hand side value of (in)equality.
223 /** This method returns \f$\alpha\f$ for a LPRowBase in regular form. However, value() may only be called for
224 * LPRowBase%s with type() != \c RANGE.
225 */
226 R value() const
227 {
228 assert(type() != RANGE);
229
230 return (rhs() < R(infinity)) ? rhs() : lhs();
231 }
232
233 /// Left-hand side value.
234 R lhs() const
235 {
236 return left;
237 }
238
239 /// Sets left-hand side value.
240 void setLhs(const R& p_left)
241 {
242 left = p_left;
243 }
244
245 /// Right-hand side value.
246 R rhs() const
247 {
248 return right;
249 }
250
251 /// Sets right-hand side value.
252 void setRhs(const R& p_right)
253 {
254 right = p_right;
255 }
256
257 /// Objective coefficient value.
258 R obj() const
259 {
260 return object;
261 }
262
263 /// Sets objective coefficient value.
264 void setObj(const R& p_obj)
265 {
266 object = p_obj;
267 }
268
269 /// Constraint row vector.
271 {
272 return vec;
273 }
274
275 /// access constraint row vector.
276 void setRowVector(const DSVectorBase<R>& p_vec)
277 {
278 vec = p_vec;
279 }
280
281 ///@}
282
283 // ------------------------------------------------------------------------------------------------------------------
284 /**@name Consistency check */
285 ///@{
286
287 /// Checks consistency.
288 bool isConsistent() const
289 {
290#ifdef ENABLE_CONSISTENCY_CHECKS
291 return vec.isConsistent();
292#else
293 return true;
294#endif
295 }
296
297 ///@}
298};
299
300} // namespace soplex
301#endif // _LPROWBASE_H_
Collection of dense, sparse, and semi-sparse vectors.
Dynamic sparse vectors.
Definition: dsvectorbase.h:53
(In)equality for LPs.
Definition: lprowbase.h:55
LPRowBase(int defDim=0)
Constructs LPRowBase with a vector ready to hold defDim nonzeros.
Definition: lprowbase.h:96
LPRowBase(const R &p_lhs, const SVectorBase< R > &p_rowVector, const R &p_rhs, const R &p_obj=0)
Constructs LPRowBase with the given left-hand side, right-hand side and rowVector.
Definition: lprowbase.h:132
R left
left-hand side of the constraint
Definition: lprowbase.h:64
~LPRowBase()
Destructor.
Definition: lprowbase.h:167
const SVectorBase< R > & rowVector() const
Constraint row vector.
Definition: lprowbase.h:270
Type
(In)Equality type of an LP row.
Definition: lprowbase.h:82
bool isConsistent() const
Checks consistency.
Definition: lprowbase.h:288
void setType(Type p_type)
Sets type of (in)equality.
Definition: lprowbase.h:192
LPRowBase(const LPRowBase< S > &row)
Copy constructor.
Definition: lprowbase.h:125
DSVectorBase< R > vec
the row vector
Definition: lprowbase.h:67
void setLhs(const R &p_left)
Sets left-hand side value.
Definition: lprowbase.h:240
R right
right-hand side of the constraint
Definition: lprowbase.h:65
R object
objective coefficient of corresponding slack variable s = vec times primal
Definition: lprowbase.h:66
void setRhs(const R &p_right)
Sets right-hand side value.
Definition: lprowbase.h:252
LPRowBase(const SVectorBase< R > &p_rowVector, Type p_type, const R &p_value, const R &p_obj=0)
Constructs LPRowBase from passed rowVector, type and value.
Definition: lprowbase.h:139
R rhs() const
Right-hand side value.
Definition: lprowbase.h:246
R value() const
Right hand side value of (in)equality.
Definition: lprowbase.h:226
LPRowBase(const LPRowBase< R > &row)
Copy constructor.
Definition: lprowbase.h:117
LPRowBase< R > & operator=(const LPRowBase< R > &row)
Assignment operator.
Definition: lprowbase.h:103
void setObj(const R &p_obj)
Sets objective coefficient value.
Definition: lprowbase.h:264
R lhs() const
Left-hand side value.
Definition: lprowbase.h:234
Type type() const
Gets type of row.
Definition: lprowbase.h:177
R obj() const
Objective coefficient value.
Definition: lprowbase.h:258
void setRowVector(const DSVectorBase< R > &p_vec)
access constraint row vector.
Definition: lprowbase.h:276
Exception class for things that should NEVER happen.
Definition: exceptions.h:119
Sparse vectors.
Definition: svectorbase.h:140
Everything should be within this namespace.
SOPLEX_THREADLOCAL const Real infinity
Definition: spxdefines.cpp:41
Debugging, floating point type and parameter definitions.
#define SPX_MSG_ERROR(x)
Prints out message x if the verbosity level is at least SPxOut::ERROR.
Definition: spxdefines.h:163