solveCobraLPLindo

PURPOSE ^

solveCobraLPLindo Solve a LP problem using Lindo

SYNOPSIS ^

function [obj,x,y,w,s,solStatus] = solveCobraLPLindo(A,b,c,csense,lb,ub,osense,primalOnlyFlag,oldAPIFlag,verbLevel,method)

DESCRIPTION ^

solveCobraLPLindo Solve a LP problem using Lindo

 [obj,x,y,w,s,solStatus] =
 solveCobraLPLindo(A,b,c,csense,lb,ub,osense,primalOnlyFlag,oldAPIFlag,verbLevel,method)

 oldAPIFLag should be true if Lindo API <2.0 is used and false for newer
 versions of the API

 Markus Herrgard 11/8/06

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function [obj,x,y,w,s,solStatus] = solveCobraLPLindo(A,b,c,csense,lb,ub,osense,primalOnlyFlag,oldAPIFlag,verbLevel,method)
0002 %solveCobraLPLindo Solve a LP problem using Lindo
0003 %
0004 % [obj,x,y,w,s,solStatus] =
0005 % solveCobraLPLindo(A,b,c,csense,lb,ub,osense,primalOnlyFlag,oldAPIFlag,verbLevel,method)
0006 %
0007 % oldAPIFLag should be true if Lindo API <2.0 is used and false for newer
0008 % versions of the API
0009 %
0010 % Markus Herrgard 11/8/06
0011 
0012 % Handle missing arguments
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; % Default is minimization
0024 end;
0025 if nargin < 8
0026     primalOnlyFlag = true; % Only get the primal soln
0027 end
0028 if nargin < 9
0029     oldAPIFlag = true; % Use old Lindo API (< 2.0)
0030 end
0031 if nargin < 10
0032     verbLevel = 0; % Verbose output
0033 end
0034 if nargin < 11
0035     method = 0; % Default is solver decides
0036 end;
0037 
0038 % Initialize
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 % if constraint senses are not given, all assumed to be equality
0053 if (isempty(csense))
0054     clear csense
0055     csense(1:m) = 'E';
0056 end;
0057 
0058 % Newer version of Lindo is used (different API)
0059 if (~oldAPIFlag)
0060 
0061     global MY_LICENSE_FILE
0062     % Set constants
0063     lindo;
0064 
0065     % Read license key from a license file
0066     [MY_LICENSE_KEY,nErr] = mxlindo('LSloadLicenseString',MY_LICENSE_FILE);
0067 
0068     % Create a LINDO environment
0069     [iEnv,nErr]=mxlindo('LScreateEnv',MY_LICENSE_KEY);
0070     if nErr ~= LSERR_NO_ERROR
0071         LMcheckError(iEnv,nErr);
0072         return;
0073     end
0074 
0075     % Declare and create a model
0076     [iModel,nErr]=mxlindo('LScreateModel',iEnv);
0077     if nErr ~= LSERR_NO_ERROR,
0078         LMcheckError(iEnv,nErr) ;
0079         return;
0080     end
0081 
0082     % Set some options
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     % Load LP the data
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         % Set LMcbLP.m as the callback function
0100         [nErr] = mxlindo('LSsetCallback',iModel,'LMcbLP','dummy');
0101         if nErr ~= LSERR_NO_ERROR
0102             return;
0103         end
0104     end
0105 
0106     % Optimize model
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         % Primal objective
0115         [obj, nErr] = mxlindo('LSgetInfo',iModel,LS_DINFO_POBJ);
0116         if nErr ~= LSERR_NO_ERROR, return; end;
0117 
0118         % Primal solution
0119         [x,nErr]=mxlindo('LSgetPrimalSolution',iModel);
0120         if nErr ~= LSERR_NO_ERROR, return; end;
0121 
0122         if (~primalOnlyFlag)
0123 
0124             % Dual solution
0125             [y,nErr]=mxlindo('LSgetDualSolution',iModel);
0126             if nErr ~= LSERR_NO_ERROR, return; end;
0127 
0128             % Slacks
0129             [s,nErr]=mxlindo('LSgetSlacks',iModel);
0130             if nErr ~= LSERR_NO_ERROR, return; end;
0131 
0132             % Reduced costs
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     % Report some statistics
0145     if (verbLevel > 0)
0146         % get solution stats
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     % Close the interface and terminate
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 % Old Lindo
0187 
0188     global LINDOAPIHOME;
0189     
0190     iEnv = 0;
0191     iModel = 0;
0192 
0193     % Hook to the LINDO environment
0194     nErr=mxlindo('LScreateEnv',iEnv,LINDOAPIHOME);
0195     if nErr ~= 0
0196         error(['Problem with Lindo: ' num2str(nErr)]);
0197     end
0198 
0199     % Declare and create a model
0200     nErr=mxlindo('LScreateModel',iModel);
0201     if nErr ~= 0
0202         error(['Problem with Lindo: ' num2str(nErr)]);
0203     end
0204 
0205     % Load the data
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     % Solve as LP
0222     [optstat]=mxlindo('LSoptimize',iModel,method);
0223 
0224     % Check solution status
0225     [solStatus,status]=mxlindo('LSgetModelIntParameter',iModel,0);
0226 
0227     if (solStatus == 3) % Solved successfully
0228 
0229         % Get the objective value
0230         [obj,status]=mxlindo('LSgetObjective',iModel);
0231 
0232         % Get the primal and dual solution
0233         [x,status]=mxlindo('LSgetPrimalSolution',iModel);
0234 
0235         if (~primalOnlyFlag)
0236             % Get dual, reduced costs & slacks
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     % Close the interface and terminate
0253     delStatus = mxlindo('LSdeleteModel',iModel);
0254     delStatus = mxlindo('LSdeleteEnv',iEnv);
0255     
0256 end
0257 
0258 
0259 
0260

Generated on Thu 21-Jun-2012 15:39:23 by m2html © 2003