[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