[Clp] Confused by dual rays
Lingrui Liao
lingrui at gmail.com
Thu Sep 10 00:06:17 EDT 2009
I'm getting confusing results from OsiClpSolverInterface::getDualRays.
If my understanding of dual ray is correct, when a dual ray (say "y")
is added to a dual solution feasible solution, the resulting vector is
still dual feasible.
Hence, for a non-negative primal variable, its corresponding column
vector "A" should make y*A >=0 (or <=0 depending on how the problem is
written).
The problem is that I'm getting mixed signs of "y*A" for different
non-negative primal variables in the same problem.
Here is the output I got:
Clp0006I 0 Obj 0 Primal inf 25.1834 (19)
Clp0006I 18 Obj 885.72 Primal inf 9.41249 (11)
Clp0001I Primal infeasible - objective value 885.72
col[0] lb=0, ub=1.79769e+308, yA=-1917.5
col[1] lb=0, ub=1.79769e+308, yA=-1907.5
col[2] lb=0, ub=1.79769e+308, yA=-2.5
col[3] lb=0, ub=1.79769e+308, yA=24995
col[4] lb=0, ub=1.79769e+308, yA=-25000
...
Please enlighten me if this is not a bug of Clp. (I used Clp-1.10.1 with CYGWIN)
Thanks,
Lingrui Liao
Here is the source file.
/*******************source file**********************/
#include <cfloat>
#include <fstream>
#include <algorithm>
#include <vector>
#include <map>
#include <utility>
#include "OsiClpSolverInterface.hpp"
#include "CoinPackedMatrix.hpp"
using namespace std;
int main(int argc, char* argv[]){
OsiClpSolverInterface *clp=new OsiClpSolverInterface;
clp->readLp("test.lp"); //stage I w/ slacks w/o potential columns
clp->setHintParam(OsiDoPresolveInInitial,0);
clp->setHintParam(OsiDoPresolveInResolve,0);
clp->setHintParam(OsiDoDualInInitial,1);
clp->setHintParam(OsiDoDualInResolve,1);
clp->initialSolve();
if(clp->isProvenPrimalInfeasible()){
const double *dualray=clp->getDualRays(1)[0];
const double *lb=clp->getColLower();
const double *ub=clp->getColUpper();
const CoinPackedMatrix* matrix=clp->getMatrixByCol();
int rnum=clp->getNumRows();
int cnum=clp->getNumCols();
for(int i=0;i<cnum;i++){
double yA=0;
const double *A=matrix->getVector(i).getElements();
for(int j=0;j<rnum;j++){
yA+=dualray[j]*A[j];
}
cout<<"col["<<i<<"]";
cout<<" lb="<<lb[i];
cout<<", ub="<<ub[i];
cout<<", yA="<<yA;
cout<<endl;
}
}
return 0;
}
==========following are contents of "test.lp"============
\Problem name:
Minimize
obj: 885.72000 x54 + 6508.11591 x55 + 6455.20001 x56
Subject To
cons0: x55 + x56 = 1
cons1: x54 = 1
cons2: 720 x55 + 720 x56 <= 744
cons3: 738 x55 <= 744
cons4: 744 x55 + 744 x56 <= 744
cons5: <= 744
cons6: 738 x55 + 739 x56 <= 744
cons7: 744 x55 + 744 x56 <= 744
cons8: - x0 + x1 = 0
cons9: - x2 + x3 = 0
cons10: - x4 + x5 = 0
cons11: - x6 + x7 = 0
cons12: - x8 + x9 = 0
cons13: - x10 + x11 = 0
cons14: - x0 + x12 = 0
cons15: - x2 + x13 = 0
cons16: - x4 + x14 = 0
cons17: - x6 + x15 = 0
cons18: - x8 + x16 = 0
cons19: - x10 + x17 = 0
cons20: x12 - x18 = 0
cons21: x13 - x19 = 0
cons22: x14 - x20 = 0
cons23: x15 - x21 = 0
cons24: x16 - x22 = 0
cons25: x17 - x23 = 0
cons26: x1 - x24 = 0
cons27: x3 - x25 = 0
cons28: x5 - x26 = 0
cons29: x7 - x27 = 0
cons30: x9 - x28 = 0
cons31: x11 - x29 = 0
cons32: x18 <= 1
cons33: x19 <= 1
cons34: x20 <= 1
cons35: x21 <= 1
cons36: x22 <= 1
cons37: x23 <= 1
cons39: x18 - x30 = 0
cons40: x19 - x31 = 0
cons41: x20 - x32 = 0
cons42: x21 - x33 = 0
cons43: x22 - x34 = 0
cons44: x23 - x35 = 0
cons45: -10000 x0 + 16 x55 + 16 x56 <= 0
cons46: -10000 x2 + 18 x55 <= 0
cons47: -10000 x4 + 27 x55 + 29 x56 <= 0
cons48: -10000 x6 <= 0
cons49: -10000 x8 + 18 x55 + 18 x56 <= 0
cons50: -10000 x10 + 31 x55 + 31 x56 <= 0
cons51: x0 -16 x55 -16 x56 <= 0
cons52: x2 -18 x55 <= 0
cons53: x4 -27 x55 -29 x56 <= 0
cons54: x6 <= 0
cons55: x8 -18 x55 -18 x56 <= 0
cons56: x10 -31 x55 -31 x56 <= 0
cons57: x0 <= 0
cons58: x2 -18 x37 <= 0
cons59: x4 -31 x38 <= 0
cons60: x6 -24 x39 <= 0
cons61: x8 -18 x40 <= 0
cons62: x10 -31 x41 <= 0
cons63: - x0 <= 0
cons64: - x2 + x37 <= 0
cons65: - x4 + x38 <= 0
cons66: - x6 + x39 <= 0
cons67: - x8 + x40 <= 0
cons68: - x10 + x41 <= 0
cons69: - x1 + x42 <= 0
cons70: - x12 + x43 <= 0
cons71: - x3 + x44 <= 0
cons72: - x13 + x45 <= 0
cons73: - x5 + x46 <= 0
cons74: - x14 + x47 <= 0
cons75: - x7 + x48 <= 0
cons76: - x15 + x49 <= 0
cons77: - x9 + x50 <= 0
cons78: - x16 + x51 <= 0
cons79: - x11 + x52 <= 0
cons80: - x17 + x53 <= 0
cons81: - x42 + x43 = 0
cons82: - x37 - x44 + x45 = 0
cons83: - x38 - x46 + x47 = 0
cons84: - x39 - x48 + x49 = 0
cons85: - x40 - x50 + x51 = 0
cons86: - x41 - x52 + x53 = 0
cons87: x42 - x43 = 0
cons88: x37 + x44 - x45 = 0
cons89: x38 + x46 - x47 = 0
cons90: x39 + x48 - x49 = 0
cons91: x40 + x50 - x51 = 0
cons92: x41 + x52 - x53 = 0
cons94: x37 <= 1
cons95: x38 <= 1
cons96: x39 <= 1
cons97: x40 <= 1
cons98: x41 <= 1
cons99: x18 <= 1
cons100: x19 <= 1
cons101: x20 <= 1
cons102: x21 <= 1
cons103: x22 <= 1
cons104: x23 <= 1
Bounds
1 <= x17
1 <= x18
1 <= x20
1 <= x22
1 <= x38
1 <= x40
1 <= x41
End
More information about the Clp
mailing list