-
Notifications
You must be signed in to change notification settings - Fork 279
Expand file tree
/
Copy pathtest_lp.py
More file actions
114 lines (96 loc) · 4.68 KB
/
test_lp.py
File metadata and controls
114 lines (96 loc) · 4.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
from pyscipopt import LP
from pyscipopt import SCIP_LPPARAM
from pyscipopt import SCIP_BASESTAT
def test_lp():
# create LP instance, minimizing by default
myLP = LP()
# get default int and real parameters, some solver-specific parameters are commented.
defaultLPParFromScratch = myLP.getIntParam(SCIP_LPPARAM.FROMSCRATCH)
defaultLPParScaling = myLP.getIntParam(SCIP_LPPARAM.SCALING)
defaultLPParPricing = myLP.getIntParam(SCIP_LPPARAM.PRICING)
defaultLPParLpinfo = myLP.getIntParam(SCIP_LPPARAM.LPINFO)
defaultLPParLpitlim = myLP.getIntParam(SCIP_LPPARAM.LPITLIM)
defaultLPParFeastol = myLP.getRealParam(SCIP_LPPARAM.FEASTOL)
defaultLPParDualfeastol = myLP.getRealParam(SCIP_LPPARAM.DUALFEASTOL)
defaultLPParObjlim = myLP.getRealParam(SCIP_LPPARAM.OBJLIM)
defaultLPParLptilim = myLP.getRealParam(SCIP_LPPARAM.LPTILIM)
# try the following nondefault parameters
tryLPParFromScratch = 0 if defaultLPParFromScratch == 1 else 1
tryLPParScaling = 0 if defaultLPParScaling == 1 else 1
tryLPParPricing = 0 if defaultLPParPricing == 1 else 1
tryLPParLpinfo = 0 if defaultLPParLpinfo == 1 else 1
tryLPParLpitlim = max(defaultLPParLpitlim - 1, 0)
tryLPParFeastol = defaultLPParFeastol + 0.1
tryLPParDualfeastol = defaultLPParDualfeastol + 0.1
tryLPParObjlim = defaultLPParObjlim + 1.0
tryLPParLptilim = defaultLPParLptilim + 1.0
myLP.setIntParam(SCIP_LPPARAM.FROMSCRATCH, tryLPParFromScratch)
myLP.setIntParam(SCIP_LPPARAM.SCALING, tryLPParScaling)
myLP.setIntParam(SCIP_LPPARAM.PRICING, tryLPParPricing)
myLP.setIntParam(SCIP_LPPARAM.LPINFO, tryLPParLpinfo)
myLP.setIntParam(SCIP_LPPARAM.LPITLIM, tryLPParLpitlim)
myLP.setRealParam(SCIP_LPPARAM.FEASTOL, tryLPParFeastol)
myLP.setRealParam(SCIP_LPPARAM.DUALFEASTOL, tryLPParDualfeastol)
myLP.setRealParam(SCIP_LPPARAM.OBJLIM, tryLPParObjlim)
myLP.setRealParam(SCIP_LPPARAM.LPTILIM, tryLPParLptilim)
assert tryLPParFromScratch == myLP.getIntParam(SCIP_LPPARAM.FROMSCRATCH)
assert tryLPParScaling == myLP.getIntParam(SCIP_LPPARAM.SCALING)
assert tryLPParPricing == myLP.getIntParam(SCIP_LPPARAM.PRICING)
assert tryLPParLpinfo == myLP.getIntParam(SCIP_LPPARAM.LPINFO)
assert tryLPParLpitlim == myLP.getIntParam(SCIP_LPPARAM.LPITLIM)
assert tryLPParFeastol == myLP.getRealParam(SCIP_LPPARAM.FEASTOL)
assert tryLPParDualfeastol == myLP.getRealParam(SCIP_LPPARAM.DUALFEASTOL)
assert tryLPParObjlim == myLP.getRealParam(SCIP_LPPARAM.OBJLIM)
assert tryLPParLptilim == myLP.getRealParam(SCIP_LPPARAM.LPTILIM)
# set back default parameters
myLP.setIntParam(SCIP_LPPARAM.FROMSCRATCH, defaultLPParFromScratch)
myLP.setIntParam(SCIP_LPPARAM.SCALING, defaultLPParScaling)
myLP.setIntParam(SCIP_LPPARAM.PRICING, defaultLPParPricing)
myLP.setIntParam(SCIP_LPPARAM.LPINFO, defaultLPParLpinfo)
myLP.setIntParam(SCIP_LPPARAM.LPITLIM, defaultLPParLpitlim)
myLP.setRealParam(SCIP_LPPARAM.FEASTOL, defaultLPParFeastol)
myLP.setRealParam(SCIP_LPPARAM.DUALFEASTOL, defaultLPParDualfeastol)
myLP.setRealParam(SCIP_LPPARAM.OBJLIM, defaultLPParObjlim)
myLP.setRealParam(SCIP_LPPARAM.LPTILIM, defaultLPParLptilim)
# create cols w/o coefficients, 0 objective coefficient and 0,\infty bounds
myLP.addCols(2 * [[]])
# create rows
myLP.addRow(entries = [(0,1),(1,2)] ,lhs = 5)
lhs, rhs = myLP.getSides()
assert lhs[0] == 5.0
assert rhs[0] == myLP.infinity()
assert(myLP.ncols() == 2)
myLP.chgObj(0, 1.0)
myLP.chgObj(1, 4.0)
solval = myLP.solve()
assert(myLP.isOptimal())
assert(myLP.getPrimal() is not None)
assert(myLP.getDual() is not None)
redcost = myLP.getRedcost()
assert(redcost is not None)
for i in redcost:
assert(i is not None)
activity = myLP.getActivity()
assert(activity is not None)
for i in activity:
assert(i is not None)
assert round(myLP.getObjVal() == solval)
assert round(5.0 == solval)
# test basis get/set
binds = myLP.getBasisInds()
assert len(binds) == myLP.nrows()
cstat, rstat = myLP.getBase()
assert len(cstat) == myLP.ncols()
assert len(rstat) == myLP.nrows()
assert all(s in (SCIP_BASESTAT.LOWER, SCIP_BASESTAT.BASIC,
SCIP_BASESTAT.UPPER, SCIP_BASESTAT.ZERO) for s in cstat)
assert all(s in (SCIP_BASESTAT.LOWER, SCIP_BASESTAT.BASIC,
SCIP_BASESTAT.UPPER) for s in rstat)
# set the same basis back and re-solve
myLP.setBase(cstat, rstat)
solval2 = myLP.solve()
assert round(solval2, 10) == round(solval, 10)
# verify basis is preserved after set
cstat2, rstat2 = myLP.getBase()
assert cstat2 == cstat
assert rstat2 == rstat