0001 function [obj,x,y,w,s,solStatus] = solveCobraLPLindo(A,b,c,csense,lb,ub,osense,primalOnlyFlag,oldAPIFlag,verbLevel,method)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 if nargin < 4
0014 csense = [];
0015 end
0016 if nargin < 5
0017 lb = [];
0018 end
0019 if nargin < 6
0020 ub = [];
0021 end
0022 if nargin < 7
0023 osense = LS_MIN;
0024 end;
0025 if nargin < 8
0026 primalOnlyFlag = true;
0027 end
0028 if nargin < 9
0029 oldAPIFlag = true;
0030 end
0031 if nargin < 10
0032 verbLevel = 0;
0033 end
0034 if nargin < 11
0035 method = 0;
0036 end;
0037
0038
0039 x=[];
0040 y=[];
0041 s=[];
0042 w=[];
0043 obj=[];
0044 solStatus=[];
0045
0046 [m,n] = size(A);
0047
0048 if (~issparse(A))
0049 A = sparse(A);
0050 end
0051
0052
0053 if (isempty(csense))
0054 clear csense
0055 csense(1:m) = 'E';
0056 end;
0057
0058
0059 if (~oldAPIFlag)
0060
0061 global MY_LICENSE_FILE
0062
0063 lindo;
0064
0065
0066 [MY_LICENSE_KEY,nErr] = mxlindo('LSloadLicenseString',MY_LICENSE_FILE);
0067
0068
0069 [iEnv,nErr]=mxlindo('LScreateEnv',MY_LICENSE_KEY);
0070 if nErr ~= LSERR_NO_ERROR
0071 LMcheckError(iEnv,nErr);
0072 return;
0073 end
0074
0075
0076 [iModel,nErr]=mxlindo('LScreateModel',iEnv);
0077 if nErr ~= LSERR_NO_ERROR,
0078 LMcheckError(iEnv,nErr) ;
0079 return;
0080 end
0081
0082
0083 [nErr]=mxlindo('LSsetModelIntParameter',iModel,LS_IPARAM_MIP_PRINTLEVEL,1);
0084 [nErr]=mxlindo('LSsetModelDouParameter',iModel,LS_DPARAM_CALLBACKFREQ,2.5);
0085 [nErr]=mxlindo('LSsetModelDouParameter',iModel,LS_DPARAM_MIP_RELOPTTOL,0.01);
0086
0087
0088 [nErr]=mxlindo('LSXloadLPData',iModel,osense,0,c,b,csense,A,lb,ub);
0089 if nErr ~= LSERR_NO_ERROR
0090 LMcheckError(iEnv,nErr);
0091 return;
0092 end
0093
0094 if (verbLevel >1 & method==3)
0095 [nErr] = mxlindo('LSsetLogfunc',iModel,'LMcbLog','Dummy string');
0096 if nErr ~= LSERR_NO_ERROR, return; end;
0097 elseif (verbLevel>0)
0098 fprintf('\n%10s %15s %15s %15s %15s\n','ITER','PRIMAL_OBJ','DUAL_OBJ','PRIMAL_INF','DUAL_INF');
0099
0100 [nErr] = mxlindo('LSsetCallback',iModel,'LMcbLP','dummy');
0101 if nErr ~= LSERR_NO_ERROR
0102 return;
0103 end
0104 end
0105
0106
0107 [solStatus,nErr]=mxlindo('LSoptimize',iModel,method);
0108 if nErr ~= LSERR_NO_ERROR
0109 return;
0110 end
0111
0112 if (solStatus == LS_STATUS_OPTIMAL | solStatus == LS_STATUS_BASIC_OPTIMAL)
0113
0114
0115 [obj, nErr] = mxlindo('LSgetInfo',iModel,LS_DINFO_POBJ);
0116 if nErr ~= LSERR_NO_ERROR, return; end;
0117
0118
0119 [x,nErr]=mxlindo('LSgetPrimalSolution',iModel);
0120 if nErr ~= LSERR_NO_ERROR, return; end;
0121
0122 if (~primalOnlyFlag)
0123
0124
0125 [y,nErr]=mxlindo('LSgetDualSolution',iModel);
0126 if nErr ~= LSERR_NO_ERROR, return; end;
0127
0128
0129 [s,nErr]=mxlindo('LSgetSlacks',iModel);
0130 if nErr ~= LSERR_NO_ERROR, return; end;
0131
0132
0133 [w,nErr]=mxlindo('LSgetReducedCosts',iModel);
0134 if nErr ~= LSERR_NO_ERROR, return; end;
0135
0136 end
0137
0138 elseif (solStatus == LS_STATUS_UNBOUNDED)
0139
0140 obj = inf;
0141
0142 end
0143
0144
0145 if (verbLevel > 0)
0146
0147 [etime, nErr] = mxlindo('LSgetInfo',iModel,LS_IINFO_ELAPSED_TIME);
0148 [siter, nErr] = mxlindo('LSgetInfo',iModel,LS_IINFO_SIM_ITER);
0149 [biter, nErr] = mxlindo('LSgetInfo',iModel,LS_IINFO_BAR_ITER);
0150 [niter, nErr] = mxlindo('LSgetInfo',iModel,LS_IINFO_NLP_ITER);
0151 [imethod, nErr] = mxlindo('LSgetInfo',iModel,LS_IINFO_METHOD);
0152 [pfeas, nErr] = mxlindo('LSgetInfo',iModel,LS_DINFO_PINFEAS);
0153 [dfeas, nErr] = mxlindo('LSgetInfo',iModel,LS_DINFO_DINFEAS);
0154 [dobj, nErr] = mxlindo('LSgetInfo',iModel,LS_DINFO_DOBJ);
0155 [basstat, nErr] = mxlindo('LSgetInfo',iModel,LS_IINFO_BASIC_STATUS);
0156
0157 if solStatus~=LS_STATUS_BASIC_OPTIMAL & solStatus~=LS_STATUS_OPTIMAL,
0158 fprintf('\n\n No optimal solution was found. (status = %d)\n', solStatus);
0159 return;
0160 else
0161 fprintf('\n\n Optimal solution is found. (status = %d)\n\n',solStatus);
0162 fprintf(' Prim obj value : %25.12f \n',obj);
0163 fprintf(' Dual obj value : %25.12f \n',dobj);
0164 fprintf(' Primal-Dual gap : %25.12e \n',abs(dobj-obj)/(1+obj));
0165 fprintf(' Prim infeas : %25.12e \n',pfeas);
0166 fprintf(' Dual infeas : %25.12e \n',dfeas);
0167 fprintf(' Simplex iters : %25d \n',siter);
0168 fprintf(' Barrier iters : %25d \n',biter);
0169 fprintf(' Time : %25.12f \n',etime);
0170 end;
0171
0172 end
0173
0174
0175 [nErr]=mxlindo('LSdeleteModel',iModel);
0176 if nErr ~= LSERR_NO_ERROR,
0177 LMcheckError(iEnv,nErr);
0178 return;
0179 end
0180 [nErr]=mxlindo('LSdeleteEnv',iEnv);
0181 if nErr ~= LSERR_NO_ERROR,
0182 LMcheckError(iEnv,nErr);
0183 return;
0184 end
0185
0186 else
0187
0188 global LINDOAPIHOME;
0189
0190 iEnv = 0;
0191 iModel = 0;
0192
0193
0194 nErr=mxlindo('LScreateEnv',iEnv,LINDOAPIHOME);
0195 if nErr ~= 0
0196 error(['Problem with Lindo: ' num2str(nErr)]);
0197 end
0198
0199
0200 nErr=mxlindo('LScreateModel',iModel);
0201 if nErr ~= 0
0202 error(['Problem with Lindo: ' num2str(nErr)]);
0203 end
0204
0205
0206 nErr=mxlindo('LSXloadLPData',iModel,osense,0,c,b,csense,A,lb,ub);
0207 if nErr ~= 0
0208 error(['Problem with Lindo: ' num2str(nErr)]);
0209 end
0210
0211 if (verbLevel > 1)
0212 [status] = mxlindo('LSsetLogfunc',iModel,'Default Log','Dummy string');
0213 elseif (verbLevel > 0)
0214 fprintf('\n%10s %15s %15s %15s %15s\n','iter','obj','dobj','pinf','dinf');
0215 status = mxlindo('LSsetCallback',iModel,'LMcback','Dummy string');
0216 end;
0217
0218 LS_IPARAM_LP_PRINTLEVEL = 39;
0219 [setstatus]=mxlindo('LSsetModelIntParameter',iModel,LS_IPARAM_LP_PRINTLEVEL,verbLevel);
0220
0221
0222 [optstat]=mxlindo('LSoptimize',iModel,method);
0223
0224
0225 [solStatus,status]=mxlindo('LSgetModelIntParameter',iModel,0);
0226
0227 if (solStatus == 3)
0228
0229
0230 [obj,status]=mxlindo('LSgetObjective',iModel);
0231
0232
0233 [x,status]=mxlindo('LSgetPrimalSolution',iModel);
0234
0235 if (~primalOnlyFlag)
0236
0237 [y,status]=mxlindo('LSgetDualSolution',iModel);
0238 [w,status]=mxlindo('LSgetReducedCosts',iModel);
0239 [s,status]=mxlindo('LSgetSlacks',iModel);
0240 else
0241 y = [];
0242 w = [];
0243 s = [];
0244 end
0245
0246 elseif (solStatus == 6 | solStatus == 5)
0247
0248 obj = Inf;
0249
0250 end
0251
0252
0253 delStatus = mxlindo('LSdeleteModel',iModel);
0254 delStatus = mxlindo('LSdeleteEnv',iEnv);
0255
0256 end
0257
0258
0259
0260