diff options
Diffstat (limited to 'macros/linprog.sci')
-rw-r--r-- | macros/linprog.sci | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/macros/linprog.sci b/macros/linprog.sci new file mode 100644 index 0000000..4c949ba --- /dev/null +++ b/macros/linprog.sci @@ -0,0 +1,199 @@ +// Copyright (C) 2015 - IIT Bombay - FOSSEE +// +// This file must be used under the terms of the CeCILL. +// This source file is licensed as described in the file COPYING, which +// you should have received as part of this distribution. The terms +// are also available at +// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt +// Author: Guru Pradeep Reddy, Bhanu Priya Sayal +// Organization: FOSSEE, IIT Bombay +// Email: toolbox@scilab.in + + +function [xopt,fopt,exitflag,output,lambda] = linprog (varargin) + // Solves a linear programming problem. + // + // Calling Sequence + // xopt = linprog(c,A,b) + // xopt = linprog(c,A,b,Aeq,beq) + // xopt = linprog(c,A,b,Aeq,beq,lb,ub) + // xopt = linprog(c,A,b,Aeq,beq,lb,ub,param) + // [xopt, fopt, exitflag, output, lambda] = linprog(file) + // [xopt,fopt,exitflag,output,lambda] = linprog( ... ) + // + // Parameters + // c : a vector of double, contains coefficients of the variables in the objective + // A : a matrix of double, represents the linear coefficients in the inequality constraints A⋅x ≤ b. + // b : a vector of double, represents the linear coefficients in the inequality constraints A⋅x ≤ b. + // Aeq : a matrix of double, represents the linear coefficients in the equality constraints Aeq⋅x = beq. + // beq : a vector of double, represents the linear coefficients in the equality constraints Aeq⋅x = beq. + // lb : Lower bounds, specified as a vector or array of double. lb represents the lower bounds elementwise in lb ≤ x ≤ ub. + // ub : Upper bounds, specified as a vector or array of double. ub represents the upper bounds elementwise in lb ≤ x ≤ ub. + // options : a list containing the parameters to be set. + // file : a string describing the path to the mps file. + // xopt : a vector of double, the computed solution of the optimization problem. + // fopt : a double, the value of the function at x. + // status : status flag returned from symphony. See below for details. + // output : The output data structure contains detailed information about the optimization process. See below for details. + // lambda : The structure consist of the Lagrange multipliers at the solution of problem. See below for details. + // + // Description + // OSI-CLP is used for solving the linear programming problems, OSI-CLP is a library written in C++. + // Search the minimum of a constrained linear programming problem specified by : + // + // <latex> + // \begin{eqnarray} + // &\mbox{min}_{x} + // & c^T⋅x \\ + // & \text{subject to} & A⋅x \leq b \\ + // & & Aeq⋅x = beq \\ + // & & lb \leq x \leq ub \\ + // \end{eqnarray} + // </latex> + // The routine calls Clp for solving the linear programming problem, Clp is a library written in C++. + // + // The exitflag allows to know the status of the optimization which is given back by Ipopt. + // <itemizedlist> + // <listitem>exitflag=0 : Optimal Solution Found </listitem> + // <listitem>exitflag=1 : Primal Infeasible </listitem> + // <listitem>exitflag=2 : Dual Infeasible</listitem> + // <listitem>exitflag=3 : Maximum Number of Iterations Exceeded. Output may not be optimal.</listitem> + // <listitem>exitflag=4 : Solution Abandoned</listitem> + // <listitem>exitflag=5 : Primal objective limit reached.</listitem> + // <listitem>exitflag=6 : Dual objective limit reached.</listitem> + // </itemizedlist> + // + // For more details on exitflag see the ipopt documentation, go to http://www.coin-or.org/Ipopt/documentation/ + // + // The output data structure contains detailed informations about the optimization process. + // It has type "struct" and contains the following fields. + // <itemizedlist> + // <listitem>output.iterations: The number of iterations performed during the search</listitem> + // <listitem>output.constrviolation: The max-norm of the constraint violation.</listitem> + // </itemizedlist> + // + // The lambda data structure contains the Lagrange multipliers at the end + // of optimization. In the current version the values are returned only when the the solution is optimal. + // It has type "struct" and contains the following fields. + // <itemizedlist> + // <listitem>lambda.lower: The Lagrange multipliers for the lower bound constraints.</listitem> + // <listitem>lambda.upper: The Lagrange multipliers for the upper bound constraints.</listitem> + // <listitem>lambda.eqlin: The Lagrange multipliers for the linear equality constraints.</listitem> + // <listitem>lambda.ineqlin: The Lagrange multipliers for the linear inequality constraints.</listitem> + // </itemizedlist> + // + // Examples + // //Optimal problems + // //Linear program, linear inequality constraints + // c=[-1,-1/3]' + // A=[1,1;1,1/4;1,-1;-1/4,-1;-1,-1;-1,1] + // b=[2,1,2,1,-1,2] + // [xopt,fopt,exitflag,output,lambda]=linprog(c, A, b) + // // Press ENTER to continue + // + // Examples + // //Linear program with Linear Inequalities and Equalities` + // c=[-1,-1/3]' + // A=[1,1;1,1/4;1,-1;-1/4,-1;-1,-1;-1,1] + // b=[2,1,2,1,-1,2] + // Aeq=[1,1/4] + // beq=[1/2] + // [xopt,fopt,exitflag,output,lambda]=linprog(c, A, b, Aeq, beq) + // // Press ENTER to continue + // + // Examples + // //Linear program with all constraint types + // c=[-1,-1/3]' + // A=[1,1;1,1/4;1,-1;-1/4,-1;-1,-1;-1,1] + // b=[2,1,2,1,-1,2] + // Aeq=[1,1/4] + // beq=[1/2] + // lb=[-1,-0.5] + // ub=[1.5,1.25] + // [xopt,fopt,exitflag,output,lambda]=linprog(c, A, b, Aeq, beq, lb, ub) + // // Press ENTER to continue + // + // Examples + // //Primal Infeasible Problem + // c=[-1,-1,-1]' + // A=[1,2,-1] + // b=[-4] + // Aeq=[1,5,3;1,1,0] + // beq=[10,100] + // lb=[0,0,0] + // ub=[%inf,%inf,%inf] + // [xopt,fopt,exitflag,output,lambda]= linprog(c,A,b,Aeq,beq,lb,ub) + // // Press ENTER to continue + // + // Examples + // //Dual Infeasible Problem + // c=[3,5,-7]' + // A=[-1,-1,4;1,1,4] + // b=[-8,5] + // Aeq=[] + // beq=[] + // lb=[-%inf,-%inf,-%inf] + // ub=[%inf,%inf,%inf] + // [xopt,fopt,exitflag,output,lambda]= linprog(c,A,b,Aeq,beq,lb,ub) + // // Press ENTER to continue + // + // Examples + // filepath = get_absolute_file_path('linprog.dem.sce'); + // filepath = filepath + "exmip1.mps" + // [xopt,fopt,exitflag,output,lambda] =linprog(filepath) + // Authors + // Bhanu Priya Sayal, Guru Pradeep Reddy + + if(type(varargin(1))==1) then + [lhs , rhs] = argn(); + //To check the number of argument given by user + if ( rhs < 3 | rhs == 4 | rhs == 6 | rhs >8 ) then + errmsg = msprintf(gettext("%s: Unexpected number of input arguments : %d provided while should be in the set of [3 5 7 8]"), "linprog", rhs); + error(errmsg) + end + + c = varargin(1); + A = varargin(2); + b = varargin(3); + + if ( rhs<4 ) then + Aeq = [] + beq = [] + else + Aeq = varargin(4); + beq = varargin(5); + end + + if ( rhs<6 ) then + lb = []; + ub = []; + else + lb = varargin(6); + ub = varargin(7); + end + + if ( rhs<8 | size(varargin(8)) ==0 ) then + param = list(); + else + param =varargin(8); + end + [xopt,fopt,exitflag,output,lambda]=matrix_linprog(c,A,b,Aeq,beq,lb,ub,param); + elseif(type(varargin(1))==10) then + + [lhs , rhs] = argn(); + + //To check the number of argument given by user + if ( rhs < 1 | rhs > 2) then + errmsg = msprintf(gettext("%s: Unexpected number of input arguments : %d provided while should be in the set of [1 2]"),"linprog",rhs); + error(errmsg) + end + mpsFile = varargin(1); + if ( rhs<2 | size(varargin(2)) ==0 ) then + param = list(); + else + param =varargin(2); + end + [xopt,fopt,exitflag,output,lambda]=mps_linprog(mpsFile,param); + end + +endfunction |