Toggle navigation
SCIP Optimization Suite
SCIP
SoPlex
ZIMPL
UG
GCG
Documentation
SoPlex 8.0.0 BETA
SoPlex 7.1.6
SoPlex 6.0.3
SoPlex 5.0.2
SoPlex 4.0.2
SoPlex 3.1.0
SoPlex 3.0.1
SoPlex 2.2.1
SoPlex
Sequential object-oriented simPlex
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Groups
Pages
soplex-repo
src
solbase.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 Roland Wunderling */
7
/* 1996-2015 Konrad-Zuse-Zentrum */
8
/* fuer Informationstechnik Berlin */
9
/* */
10
/* SoPlex is distributed under the terms of the ZIB Academic Licence. */
11
/* */
12
/* You should have received a copy of the ZIB Academic License */
13
/* along with SoPlex; see the file COPYING. If not email to soplex@zib.de. */
14
/* */
15
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
16
17
/**@file solbase.h
18
* @brief Class for storing a primal-dual solution with basis information
19
*/
20
#ifndef _SOLBASE_H_
21
#define _SOLBASE_H_
22
23
/* undefine SOPLEX_DEBUG flag from including files; if SOPLEX_DEBUG should be defined in this file, do so below */
24
#ifdef SOPLEX_DEBUG
25
#define SOPLEX_DEBUG_SOLBASE
26
#undef SOPLEX_DEBUG
27
#endif
28
29
#include <assert.h>
30
#include <string.h>
31
#include <math.h>
32
#include <iostream>
33
34
#include "
basevectors.h
"
35
#include "
spxsolver.h
"
// needed for basis information
36
37
namespace
soplex
38
{
39
/**@class SolBase
40
* @brief Class for storing a primal-dual solution with basis information
41
* @ingroup Algo
42
*/
43
template
<
class
R >
44
class
SolBase
45
{
46
friend
class
SoPlex
;
47
template
<
class
S >
friend
class
SolBase
;
48
49
public
:
50
/// is a primal feasible solution available?
51
bool
hasPrimal
()
const
52
{
53
return
_hasPrimal
;
54
}
55
56
/// gets the primal solution vector if available; returns true on success
57
bool
getPrimal
(
VectorBase<R>
& vector)
const
58
{
59
if
(
_hasPrimal
)
60
vector =
_primal
;
61
62
return
_hasPrimal
;
63
}
64
65
/// gets the vector of slack values if available; returns true on success
66
bool
getSlacks
(
VectorBase<R>
& vector)
const
67
{
68
if
(
_hasPrimal
)
69
vector =
_slacks
;
70
71
return
_hasPrimal
;
72
}
73
74
/// is a primal unbounded ray available?
75
bool
hasPrimalRay
()
const
76
{
77
return
_hasPrimalRay
;
78
}
79
80
/// gets the primal unbounded ray if available; returns true on success
81
bool
getPrimalRay
(
VectorBase<R>
& vector)
const
82
{
83
if
(
_hasPrimalRay
)
84
vector =
_primalRay
;
85
86
return
_hasPrimalRay
;
87
}
88
89
/// is a dual solution available?
90
bool
hasDual
()
const
91
{
92
return
_hasDual
;
93
}
94
95
/// gets the dual solution vector if available; returns true on success
96
bool
getDual
(
VectorBase<R>
& vector)
const
97
{
98
if
(
_hasDual
)
99
vector =
_dual
;
100
101
return
_hasDual
;
102
}
103
104
/// gets the vector of reduced cost values if available; returns true on success
105
bool
getRedCost
(
VectorBase<R>
& vector)
const
106
{
107
if
(
_hasDual
)
108
vector =
_redCost
;
109
110
return
_hasDual
;
111
}
112
113
/// is a dual farkas ray available?
114
bool
hasDualFarkas
()
const
115
{
116
return
_hasDualFarkas
;
117
}
118
119
/// gets the Farkas proof if available; returns true on success
120
bool
getDualFarkas
(
VectorBase<R>
& vector)
const
121
{
122
if
(
_hasDualFarkas
)
123
vector =
_dualFarkas
;
124
125
return
_hasDualFarkas
;
126
}
127
128
/// returns total size of primal solution
129
int
totalSizePrimal
(
const
int
base = 2)
const
130
{
131
int
size = 0;
132
133
if
(
_hasPrimal
)
134
size +=
totalSizeRational
(
_primal
.get_const_ptr(),
_primal
.dim(), base);
135
136
if
(
_hasPrimalRay
)
137
size +=
totalSizeRational
(
_primalRay
.get_const_ptr(),
_primalRay
.dim(), base);
138
139
return
size;
140
}
141
142
/// returns total size of dual solution
143
int
totalSizeDual
(
const
int
base = 2)
const
144
{
145
int
size = 0;
146
147
if
(
_hasDual
)
148
size +=
totalSizeRational
(
_dual
.get_const_ptr(),
_dual
.dim(), base);
149
150
if
(
_hasDualFarkas
)
151
size +=
totalSizeRational
(
_dualFarkas
.get_const_ptr(),
_dualFarkas
.dim(), base);
152
153
return
size;
154
}
155
156
/// returns size of least common multiple of denominators in primal solution
157
int
dlcmSizePrimal
(
const
int
base = 2)
const
158
{
159
int
size = 0;
160
161
if
(
_hasPrimal
)
162
size +=
dlcmSizeRational
(
_primal
.get_const_ptr(),
_primal
.dim(), base);
163
164
if
(
_hasPrimalRay
)
165
size +=
dlcmSizeRational
(
_primalRay
.get_const_ptr(),
_primalRay
.dim(), base);
166
167
return
size;
168
}
169
170
/// returns size of least common multiple of denominators in dual solution
171
int
dlcmSizeDual
(
const
int
base = 2)
const
172
{
173
int
size = 0;
174
175
if
(
_hasDual
)
176
size +=
dlcmSizeRational
(
_dual
.get_const_ptr(),
_dual
.dim(), base);
177
178
if
(
_hasDualFarkas
)
179
size +=
dlcmSizeRational
(
_dualFarkas
.get_const_ptr(),
_dualFarkas
.dim(), base);
180
181
return
size;
182
}
183
184
/// returns size of largest denominator in primal solution
185
int
dmaxSizePrimal
(
const
int
base = 2)
const
186
{
187
int
size = 0;
188
189
if
(
_hasPrimal
)
190
size +=
dmaxSizeRational
(
_primal
.get_const_ptr(),
_primal
.dim(), base);
191
192
if
(
_hasPrimalRay
)
193
size +=
dmaxSizeRational
(
_primalRay
.get_const_ptr(),
_primalRay
.dim(), base);
194
195
return
size;
196
}
197
198
/// returns size of largest denominator in dual solution
199
int
dmaxSizeDual
(
const
int
base = 2)
const
200
{
201
int
size = 0;
202
203
if
(
_hasDual
)
204
size +=
dmaxSizeRational
(
_dual
.get_const_ptr(),
_dual
.dim(), base);
205
206
if
(
_hasDualFarkas
)
207
size +=
dmaxSizeRational
(
_dualFarkas
.get_const_ptr(),
_dualFarkas
.dim(), base);
208
209
return
size;
210
}
211
212
/// invalidate solution
213
void
invalidate
()
214
{
215
_hasPrimal
=
false
;
216
_hasPrimalRay
=
false
;
217
_hasDual
=
false
;
218
_hasDualFarkas
=
false
;
219
}
220
221
private
:
222
DVectorBase<R>
_primal
;
223
DVectorBase<R>
_slacks
;
224
DVectorBase<R>
_primalRay
;
225
DVectorBase<R>
_dual
;
226
DVectorBase<R>
_redCost
;
227
DVectorBase<R>
_dualFarkas
;
228
229
R
_primalObjVal
;
230
R
_dualObjVal
;
231
232
unsigned
int
_hasPrimal
:1;
233
unsigned
int
_hasPrimalRay
:1;
234
unsigned
int
_hasDual
:1;
235
unsigned
int
_hasDualFarkas
:1;
236
237
/// default constructor only for friends
238
SolBase<R>
()
239
:
_primalObjVal
(0)
240
,
_dualObjVal
(0)
241
{
242
invalidate
();
243
}
244
245
/// assignment operator only for friends
246
SolBase<R>
&
operator=
(
const
SolBase<R>
& sol)
247
{
248
if
(
this
!= &sol )
249
{
250
251
_hasPrimal
= sol.
_hasPrimal
;
252
if
(
_hasPrimal
)
253
{
254
_primal
= sol.
_primal
;
255
_slacks
= sol.
_slacks
;
256
_primalObjVal
= sol.
_primalObjVal
;
257
}
258
259
_hasPrimalRay
= sol.
_hasPrimalRay
;
260
if
(
_hasPrimalRay
)
261
_primalRay
= sol.
_primalRay
;
262
263
_hasDual
= sol.
_hasDual
;
264
if
(
_hasDual
)
265
{
266
_dual
= sol.
_dual
;
267
_redCost
= sol.
_redCost
;
268
_dualObjVal
= sol.
_dualObjVal
;
269
}
270
271
_hasDualFarkas
= sol.
_hasDualFarkas
;
272
if
(
_hasDualFarkas
)
273
_dualFarkas
= sol.
_dualFarkas
;
274
}
275
276
return
*
this
;
277
}
278
279
/// assignment operator only for friends
280
template
<
class
S >
281
SolBase<R>
&
operator=
(
const
SolBase<S>
& sol)
282
{
283
if
( (
SolBase<S>
*)
this
!= &sol )
284
{
285
286
_hasPrimal
= sol.
_hasPrimal
;
287
if
(
_hasPrimal
)
288
{
289
_primal
= sol.
_primal
;
290
_slacks
= sol.
_slacks
;
291
_primalObjVal
= R(sol.
_primalObjVal
);
292
}
293
294
_hasPrimalRay
= sol.
_hasPrimalRay
;
295
if
(
_hasPrimalRay
)
296
_primalRay
= sol.
_primalRay
;
297
298
_hasDual
= sol.
_hasDual
;
299
if
(
_hasDual
)
300
{
301
_dual
= sol.
_dual
;
302
_redCost
= sol.
_redCost
;
303
_dualObjVal
= R(sol.
_dualObjVal
);
304
}
305
306
_hasDualFarkas
= sol.
_hasDualFarkas
;
307
if
(
_hasDualFarkas
)
308
_dualFarkas
= sol.
_dualFarkas
;
309
}
310
311
return
*
this
;
312
}
313
};
314
}
// namespace soplex
315
316
/* reset the SOPLEX_DEBUG flag to its original value */
317
#undef SOPLEX_DEBUG
318
#ifdef SOPLEX_DEBUG_SOLBASE
319
#define SOPLEX_DEBUG
320
#undef SOPLEX_DEBUG_SOLBASE
321
#endif
322
323
#endif // _SOLBASE_H_