diff options
Diffstat (limited to 'macros')
-rw-r--r-- | macros/lib | bin | 456 -> 480 bytes | |||
-rw-r--r-- | macros/names | 1 | ||||
-rw-r--r-- | macros/qpipopt.bin | bin | 26088 -> 27036 bytes | |||
-rw-r--r-- | macros/qpipopt.sci | 78 | ||||
-rw-r--r-- | macros/qpipopt.sci~ | 172 | ||||
-rw-r--r-- | macros/qpipopt_mat.bin | bin | 0 -> 31224 bytes | |||
-rw-r--r-- | macros/qpipopt_mat.sci | 214 | ||||
-rw-r--r-- | macros/qpipopt_mat.sci~ | 214 | ||||
-rw-r--r-- | macros/symphony_mat.bin | bin | 45744 -> 45744 bytes | |||
-rw-r--r-- | macros/symphony_mat.sci | 2 |
10 files changed, 645 insertions, 36 deletions
Binary files differ diff --git a/macros/names b/macros/names index da92859..ef678fc 100644 --- a/macros/names +++ b/macros/names @@ -1,4 +1,5 @@ qpipopt +qpipopt_mat setOptions symphony symphony_call diff --git a/macros/qpipopt.bin b/macros/qpipopt.bin Binary files differindex 594d645..757b5b6 100644 --- a/macros/qpipopt.bin +++ b/macros/qpipopt.bin diff --git a/macros/qpipopt.sci b/macros/qpipopt.sci index 0d1b6b6..4f8c535 100644 --- a/macros/qpipopt.sci +++ b/macros/qpipopt.sci @@ -20,7 +20,7 @@ function [xopt,fopt,exitflag,output,lambda] = qpipopt (varargin) // Parameters // nbVar : a 1 x 1 matrix of doubles, number of variables // nbCon : a 1 x 1 matrix of doubles, number of constraints - // Q : a n x n matrix of doubles, where n is number of variables, represents coefficients of quadratic in the quadratic problem. + // Q : a n x n symmetric matrix of doubles, where n is number of variables, represents coefficients of quadratic in the quadratic problem. // p : a 1 x n matrix of doubles, where n is number of variables, represents coefficients of linear in the quadratic problem // LB : a 1 x n matrix of doubles, where n is number of variables, contains lower bounds of the variables. // UB : a 1 x n matrix of doubles, where n is number of variables, contains upper bounds of the variables. @@ -50,42 +50,39 @@ function [xopt,fopt,exitflag,output,lambda] = qpipopt (varargin) // // Examples // //Find x in R^6 such that: - // // conMatrix= [1,-1,1,0,3,1; // -1,0,-3,-4,5,6; // 2,5,3,0,1,0 // 0,1,0,1,2,-1; // -1,0,2,1,1,0]; - // conLB=[1 2 3 -%inf -%inf]'; - // conUB = [1 2 3 -1 2.5]'; - // //with x between ci and cs: - // lb=[-1000 -10000 0 -1000 -1000 -1000]; - // ub=[10000 100 1.5 100 100 1000]; + // conLB=[1;2;3;-%inf;-%inf]; + // conUB = [1;2;3;-1;2.5]; + // lb=[-1000;-10000; 0; -1000; -1000; -1000]; + // ub=[10000; 100; 1.5; 100; 100; 1000]; // //and minimize 0.5*x'*Q*x + p'*x with - // p=[1 2 3 4 5 6]; Q=eye(6,6); + // p=[1; 2; 3; 4; 5; 6]; Q=eye(6,6); // nbVar = 6; // nbCon = 5; // [xopt,fopt,exitflag,output,lambda]=qpipopt(nbVar,nbCon,Q,p,lb,ub,conMatrix,conLB,conUB) // // Examples - // //min. -8*x1 -16*x2 + x1^2 + 4* x2^2 - // // such that - // // x1 + x2 <= 5, - // // x1 <= 3, - // // x1 >= 0, - // // x2 >= 0 - // conMatrix= [1 1]; - // conLB=[-%inf]; - // conUB = [5]; - // //with x between ci and cs: - // lb=[0,0]; - // ub=[3,%inf]; - // //and minimize 0.5*x'*Q*x + p'*x with - // p=[-8,-16]; - // Q=[1,0;0,4]; - // nbVar = 2; - // nbCon = 1; - // [xopt,fopt,exitflag,output,lambda] = qpipopt(nbVar,nbCon,Q,p,lb,ub,conMatrix,conLB,conUB) + // //Find the value of x that minimize following function + // // f(x) = 0.5*x1^2 + x2^2 - x1*x2 - 2*x1 - 6*x2 + // // Subject to: + // // x1 + x2 ≤ 2 + // // –x1 + 2x2 ≤ 2 + // // 2x1 + x2 ≤ 3 + // // 0 ≤ x1, 0 ≤ x2. + // Q = [1 -1; -1 2]; + // p = [-2; -6]; + // conMatrix = [1 1; -1 2; 2 1]; + // conUB = [2; 2; 3]; + // conLB = [-%inf; -%inf; -%inf]; + // lb = [0; 0]; + // ub = [%inf; %inf]; + // nbVar = 2; + // nbCon = 3; + // [xopt,fopt,exitflag,output,lambda] = qpipopt(nbVar,nbCon,Q,p,lb,ub,conMatrix,conLB,conUB) // // Authors // Keyur Joshi, Saikiran, Iswarya, Harpreet Singh @@ -109,10 +106,21 @@ function [xopt,fopt,exitflag,output,lambda] = qpipopt (varargin) UB = varargin(6); conMatrix = varargin(7); conLB = varargin(8); - conLB = conLB'; //IPOpt wants it in row matrix form conUB = varargin(9); - conUB = conUB'; //IPOpt wants it in row matrix form + //IPOpt wants it in row matrix form + p = p'; + LB = LB'; + UB = UB'; + conLB = conLB'; + conUB = conUB'; + + //Checking the Q matrix which needs to be a symmetric matrix + if ( Q~=Q') then + errmsg = msprintf(gettext("%s: Q is not a symmetric matrix"), "qpipopt"); + error(errmsg); + end + //Check the size of Q which should equal to the number of variable if ( size(Q) ~= [nbVar nbVar]) then errmsg = msprintf(gettext("%s: The Size of Q is not equal to the number of variables"), "qpipopt"); @@ -126,31 +134,31 @@ function [xopt,fopt,exitflag,output,lambda] = qpipopt (varargin) end -//Check the size of constraint which should equal to the number of constraints - if ( size(conMatrix,1) ~= nbCon) then - errmsg = msprintf(gettext("%s: The Lower Bound is not equal to the number of variables"), "qpipopt"); + //Check the size of constraint which should equal to the number of variables + if ( size(conMatrix,2) ~= nbVar) then + errmsg = msprintf(gettext("%s: The size of constraints is not equal to the number of variables"), "qpipopt"); error(errmsg); end -//Check the size of Lower Bound which should equal to the number of variables + //Check the size of Lower Bound which should equal to the number of variables if ( size(LB,2) ~= nbVar) then errmsg = msprintf(gettext("%s: The Lower Bound is not equal to the number of variables"), "qpipopt"); error(errmsg); end -//Check the size of Upper Bound which should equal to the number of variables + //Check the size of Upper Bound which should equal to the number of variables if ( size(UB,2) ~= nbVar) then errmsg = msprintf(gettext("%s: The Upper Bound is not equal to the number of variables"), "qpipopt"); error(errmsg); end -//Check the size of constraints of Lower Bound which should equal to the number of constraints + //Check the size of constraints of Lower Bound which should equal to the number of constraints if ( size(conLB,2) ~= nbCon) then errmsg = msprintf(gettext("%s: The Lower Bound of constraints is not equal to the number of constraints"), "qpipopt"); error(errmsg); end -//Check the size of constraints of Upper Bound which should equal to the number of constraints + //Check the size of constraints of Upper Bound which should equal to the number of constraints if ( size(conUB,2) ~= nbCon) then errmsg = msprintf(gettext("%s: The Upper Bound of constraints is not equal to the number of constraints"), "qp_ipopt"); error(errmsg); diff --git a/macros/qpipopt.sci~ b/macros/qpipopt.sci~ new file mode 100644 index 0000000..407a6b7 --- /dev/null +++ b/macros/qpipopt.sci~ @@ -0,0 +1,172 @@ +// Copyright (C) 2015 - IIT Bombay - FOSSEE +// +// Author: Harpreet Singh +// Organization: FOSSEE, IIT Bombay +// Email: harpreet.mertia@gmail.com +// 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 + + +function [xopt,fopt,exitflag,output,lambda] = qpipopt (varargin) + // Solves a linear quadratic problem. + // + // Calling Sequence + // xopt = qpipopt(nbVar,nbCon,Q,p,LB,UB,conMatrix,conLB,conUB) + // [xopt,fopt,exitflag,output,lamda] = qpipopt( ... ) + // + // Parameters + // nbVar : a 1 x 1 matrix of doubles, number of variables + // nbCon : a 1 x 1 matrix of doubles, number of constraints + // Q : a n x n symmetric matrix of doubles, where n is number of variables, represents coefficients of quadratic in the quadratic problem. + // p : a 1 x n matrix of doubles, where n is number of variables, represents coefficients of linear in the quadratic problem + // LB : a 1 x n matrix of doubles, where n is number of variables, contains lower bounds of the variables. + // UB : a 1 x n matrix of doubles, where n is number of variables, contains upper bounds of the variables. + // conMatrix : a m x n matrix of doubles, where n is number of variables and m is number of constraints, contains matrix representing the constraint matrix + // conLB : a m x 1 matrix of doubles, where m is number of constraints, contains lower bounds of the constraints. + // conUB : a m x 1 matrix of doubles, where m is number of constraints, contains upper bounds of the constraints. + // xopt : a 1xn matrix of doubles, the computed solution of the optimization problem. + // fopt : a 1x1 matrix of doubles, the function value at x. + // exitflag : Integer identifying the reason the algorithm terminated. + // output : Structure containing information about the optimization. + // lambda : Structure containing the Lagrange multipliers at the solution x (separated by constraint type). + // + // Description + // Search the minimum of a constrained linear quadratic optimization problem specified by : + // find the minimum of f(x) such that + // + // <latex> + // \begin{eqnarray} + // &\mbox{min}_{x} + // & 1/2*x'*Q*x + p'*x \\ + // & \text{subject to} & conLB \leq C(x) \leq conUB \\ + // & & lb \leq x \leq ub \\ + // \end{eqnarray} + // </latex> + // + // We are calling IPOpt for solving the quadratic problem, IPOpt is a library written in C++. The code has been written by Andreas Wächter and Carl Laird. + // + // Examples + // //Find x in R^6 such that: + // + // conMatrix= [1,-1,1,0,3,1; + // -1,0,-3,-4,5,6; + // 2,5,3,0,1,0 + // 0,1,0,1,2,-1; + // -1,0,2,1,1,0]; + // conLB=[1;2;3;-%inf;-%inf]; + // conUB = [1;2;3;-1;2.5]; + // lb=[-1000 -10000 0 -1000 -1000 -1000]; + // ub=[10000 100 1.5 100 100 1000]; + // //and minimize 0.5*x'*Q*x + p'*x with + // p=[1 2 3 4 5 6]; Q=eye(6,6); + // nbVar = 6; + // nbCon = 5; + // [xopt,fopt,exitflag,output,lambda]=qpipopt(nbVar,nbCon,Q,p,lb,ub,conMatrix,conLB,conUB) + // + // Examples + // Q = [1 -1; -1 2]; + // p = [-2 -6]; + // conMatrix = [1 1; -1 2; 2 1]; + // conUB = [2; 2; 3]; + // conLB = [-%inf; -%inf; -%inf]; + // lb = [0 0]; + // ub = [%inf %inf]; + // nbVar = 2; + // nbCon = 3; + // [xopt,fopt,exitflag,output,lambda] = qpipopt(nbVar,nbCon,Q,p,lb,ub,conMatrix,conLB,conUB) + // + // Authors + // Keyur Joshi, Saikiran, Iswarya, Harpreet Singh + + +//To check the number of input and output argument + [lhs , rhs] = argn(); + +//To check the number of argument given by user + if ( rhs ~= 9 ) then + errmsg = msprintf(gettext("%s: Unexpected number of input arguments : %d provided while should be 9"), "qpipopt", rhs); + error(errmsg) + end + + + nbVar = varargin(1); + nbCon = varargin(2); + Q = varargin(3); + p = varargin(4); + LB = varargin(5); + UB = varargin(6); + conMatrix = varargin(7); + conLB = varargin(8); + conLB = conLB'; //IPOpt wants it in row matrix form + conUB = varargin(9); + conUB = conUB'; //IPOpt wants it in row matrix form + + + //Checking the Q matrix which needs to be a symmetric matrix + if ( Q~=Q') then + errmsg = msprintf(gettext("%s: Q is not a symmetric matrix"), "qpipopt"); + error(errmsg); + end + + //Check the size of Q which should equal to the number of variable + if ( size(Q) ~= [nbVar nbVar]) then + errmsg = msprintf(gettext("%s: The Size of Q is not equal to the number of variables"), "qpipopt"); + error(errmsg); + end + + //Check the size of p which should equal to the number of variable + if ( size(p,2) ~= [nbVar]) then + errmsg = msprintf(gettext("%s: The Size of p is not equal to the number of variables"), "qpipopt"); + error(errmsg); + end + + + //Check the size of constraint which should equal to the number of variables + if ( size(conMatrix,2) ~= nbVar) then + errmsg = msprintf(gettext("%s: The size of constraints is not equal to the number of variables"), "qpipopt"); + error(errmsg); + end + + //Check the size of Lower Bound which should equal to the number of variables + if ( size(LB,2) ~= nbVar) then + errmsg = msprintf(gettext("%s: The Lower Bound is not equal to the number of variables"), "qpipopt"); + error(errmsg); + end + + //Check the size of Upper Bound which should equal to the number of variables + if ( size(UB,2) ~= nbVar) then + errmsg = msprintf(gettext("%s: The Upper Bound is not equal to the number of variables"), "qpipopt"); + error(errmsg); + end + + //Check the size of constraints of Lower Bound which should equal to the number of constraints + if ( size(conLB,2) ~= nbCon) then + errmsg = msprintf(gettext("%s: The Lower Bound of constraints is not equal to the number of constraints"), "qpipopt"); + error(errmsg); + end + + //Check the size of constraints of Upper Bound which should equal to the number of constraints + if ( size(conUB,2) ~= nbCon) then + errmsg = msprintf(gettext("%s: The Upper Bound of constraints is not equal to the number of constraints"), "qp_ipopt"); + error(errmsg); + end + + [xopt,fopt,status,iter,Zl,Zu,lmbda] = solveqp(nbVar,nbCon,Q,p,conMatrix,conLB,conUB,LB,UB); + + xopt = xopt'; + exitflag = status; + output = struct("Iterations" , []); + output.Iterations = iter; + lambda = struct("lower" , [], .. + "upper" , [], .. + "constraint" , []); + + lambda.lower = Zl; + lambda.upper = Zu; + lambda.constraint = lmbda; + + +endfunction diff --git a/macros/qpipopt_mat.bin b/macros/qpipopt_mat.bin Binary files differnew file mode 100644 index 0000000..43cce6e --- /dev/null +++ b/macros/qpipopt_mat.bin diff --git a/macros/qpipopt_mat.sci b/macros/qpipopt_mat.sci new file mode 100644 index 0000000..4c72216 --- /dev/null +++ b/macros/qpipopt_mat.sci @@ -0,0 +1,214 @@ +// Copyright (C) 2015 - IIT Bombay - FOSSEE +// +// Author: Harpreet Singh +// Organization: FOSSEE, IIT Bombay +// Email: harpreet.mertia@gmail.com +// 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 + + +function [xopt,fopt,exitflag,output,lambda] = qpipopt_mat (varargin) + // Solves a linear quadratic problem. + // + // Calling Sequence + // xopt = qpipopt_mat(nbVar,nbCon,Q,p,LB,UB,conMatrix,conLB,conUB) + // x = qpipopt_mat(H,f) + // x = qpipopt_mat(H,f,A,b) + // x = qpipopt_mat(H,f,A,b,Aeq,beq) + // x = qpipopt_mat(H,f,A,b,Aeq,beq,lb,ub) + // [xopt,fopt,exitflag,output,lamda] = qpipopt_mat( ... ) + // + // Parameters + // H : a n x n matrix of doubles, where n is number of variables, represents coefficients of quadratic in the quadratic problem. + // f : a n x 1 matrix of doubles, where n is number of variables, represents coefficients of linear in the quadratic problem + // A : a m x n matrix of doubles, represents the linear coefficients in the inequality constraints + // b : a column vector of doubles, represents the linear coefficients in the inequality constraints + // Aeq : a meq x n matrix of doubles, represents the linear coefficients in the equality constraints + // beq : a vector of doubles, represents the linear coefficients in the equality constraints + // LB : a n x 1 matrix of doubles, where n is number of variables, contains lower bounds of the variables. + // UB : a n x 1 matrix of doubles, where n is number of variables, contains upper bounds of the variables. + // xopt : a nx1 matrix of doubles, the computed solution of the optimization problem. + // fopt : a 1x1 matrix of doubles, the function value at x. + // exitflag : Integer identifying the reason the algorithm terminated. + // output : Structure containing information about the optimization. + // lambda : Structure containing the Lagrange multipliers at the solution x (separated by constraint type). + // + // Description + // Search the minimum of a constrained linear quadratic optimization problem specified by : + // find the minimum of f(x) such that + // + // <latex> + // \begin{eqnarray} + // &\mbox{min}_{x} + // & 1/2*x'*H*x + f'*x \\ + // & \text{subject to} & A.x \leq b \\ + // & & Aeq.x \leq beq \\ + // & & lb \leq x \leq ub \\ + // \end{eqnarray} + // </latex> + // + // We are calling IPOpt for solving the quadratic problem, IPOpt is a library written in C++. The code has been written by Andreas Wächter and Carl Laird. + // + // Examples + // //Find x in R^6 such that: + // + // Aeq= [1,-1,1,0,3,1; + // -1,0,-3,-4,5,6; + // 2,5,3,0,1,0]; + // beq=[1; 2; 3]; + // A= [0,1,0,1,2,-1; + // -1,0,2,1,1,0]; + // b = [-1; 2.5]; + // lb=[-1000; -10000; 0; -1000; -1000; -1000]; + // ub=[10000; 100; 1.5; 100; 100; 1000]; + // //and minimize 0.5*x'*Q*x + p'*x with + // f=[1; 2; 3; 4; 5; 6]; H=eye(6,6); + // [xopt,fopt,exitflag,output,lambda]=qpipopt_mat(H,f,A,b,Aeq,beq,lb,ub) + // clear H f A b Aeq beq lb ub; + // + // Examples + // //Find the value of x that minimize following function + // // f(x) = 0.5*x1^2 + x2^2 - x1*x2 - 2*x1 - 6*x2 + // // Subject to: + // // x1 + x2 ≤ 2 + // // –x1 + 2x2 ≤ 2 + // // 2x1 + x2 ≤ 3 + // // 0 ≤ x1, 0 ≤ x2. + // H = [1 -1; -1 2]; + // f = [-2; -6]; + // A = [1 1; -1 2; 2 1]; + // b = [2; 2; 3]; + // lb = [0; 0]; + // ub = [%inf; %inf]; + // [xopt,fopt,exitflag,output,lambda] = qpipopt_mat(H,f,A,b,[],[],lb,ub) + // + // Authors + // Keyur Joshi, Saikiran, Iswarya, Harpreet Singh + + +//To check the number of input and output argument + [lhs , rhs] = argn(); + +//To check the number of argument given by user + if ( rhs < 2 | rhs == 3 | rhs == 5 | rhs == 7 | rhs > 8 ) then + errmsg = msprintf(gettext("%s: Unexpected number of input arguments : %d provided while should be in the set of [2 4 6 8]"), "qpipopt", rhs); + error(errmsg) + end + + H = varargin(1); + f = varargin(2); + nbVar = size(H,1); + + + if ( rhs<2 ) then + A = [] + b = [] + else + A = varargin(3); + b = varargin(4); + end + + if ( rhs<4 ) then + Aeq = [] + beq = [] + else + Aeq = varargin(5); + beq = varargin(6); + end + + if ( rhs<6 ) then + LB = repmat(-%inf,nbVar,1); + UB = repmat(%inf,nbVar,1); + else + LB = varargin(7); + UB = varargin(8); + end + + nbConInEq = size(A,1); + nbConEq = size(Aeq,1); + + //Checking the H matrix which needs to be a symmetric matrix + if ( H~=H') then + errmsg = msprintf(gettext("%s: H is not a symmetric matrix"), "qpipopt_mat"); + error(errmsg); + end + + //Check the size of H which should equal to the number of variable + if ( size(H) ~= [nbVar nbVar]) then + errmsg = msprintf(gettext("%s: The Size of H is not equal to the number of variables"), "qpipopt"); + error(errmsg); + end + + //Check the size of f which should equal to the number of variable + if ( size(f,1) ~= [nbVar]) then + errmsg = msprintf(gettext("%s: The Size of f is not equal to the number of variables"), "qpipopt"); + error(errmsg); + end + + + //Check the size of inequality constraint which should be equal to the number of variables + if ( size(A,2) ~= nbVar & size(A,2) ~= 0) then + errmsg = msprintf(gettext("%s: The size of inequality constraints is not equal to the number of variables"), "qpipopt"); + error(errmsg); + end + + //Check the size of equality constraint which should be equal to the number of variables + if ( size(Aeq,2) ~= nbVar & size(Aeq,2) ~= 0 ) then + errmsg = msprintf(gettext("%s: The size of equality constraints is not equal to the number of variables"), "qpipopt"); + error(errmsg); + end + + + //Check the size of Lower Bound which should be equal to the number of variables + if ( size(LB,1) ~= nbVar) then + errmsg = msprintf(gettext("%s: The Lower Bound is not equal to the number of variables"), "qpipopt"); + error(errmsg); + end + +//Check the size of Upper Bound which should equal to the number of variables + if ( size(UB,1) ~= nbVar) then + errmsg = msprintf(gettext("%s: The Upper Bound is not equal to the number of variables"), "qpipopt"); + error(errmsg); + end + +//Check the size of constraints of Lower Bound which should equal to the number of constraints + if ( size(b,1) ~= nbConInEq & size(b,1) ~= 0) then + errmsg = msprintf(gettext("%s: The Lower Bound of inequality constraints is not equal to the number of constraints"), "qpipopt"); + error(errmsg); + end + +//Check the size of constraints of Upper Bound which should equal to the number of constraints + if ( size(beq,1) ~= nbConEq & size(beq,1) ~= 0) then + errmsg = msprintf(gettext("%s: The Upper Bound of equality constraints is not equal to the number of constraints"), "qp_ipopt"); + error(errmsg); + end + + //Converting it into ipopt format + f = f'; + LB = LB'; + UB = UB'; + conMatrix = [Aeq;A]; + nbCon = size(conMatrix,1); + conLB = [beq; repmat(-%inf,nbConInEq,1)]'; + conUB = [beq;b]' ; + [xopt,fopt,status,iter,Zl,Zu,lmbda] = solveqp(nbVar,nbCon,H,f,conMatrix,conLB,conUB,LB,UB); + + xopt = xopt'; + exitflag = status; + output = struct("Iterations" , []); + output.Iterations = iter; + lambda = struct("lower" , [], .. + "upper" , [], .. + "ineqlin" , [], .. + "eqlin" , []); + + lambda.lower = Zl; + lambda.upper = Zu; + lambda.eqlin = lmbda(1:nbConEq); + lambda.ineqlin = lmbda(nbConEq+1:nbCon); + + +endfunction diff --git a/macros/qpipopt_mat.sci~ b/macros/qpipopt_mat.sci~ new file mode 100644 index 0000000..4c72216 --- /dev/null +++ b/macros/qpipopt_mat.sci~ @@ -0,0 +1,214 @@ +// Copyright (C) 2015 - IIT Bombay - FOSSEE +// +// Author: Harpreet Singh +// Organization: FOSSEE, IIT Bombay +// Email: harpreet.mertia@gmail.com +// 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 + + +function [xopt,fopt,exitflag,output,lambda] = qpipopt_mat (varargin) + // Solves a linear quadratic problem. + // + // Calling Sequence + // xopt = qpipopt_mat(nbVar,nbCon,Q,p,LB,UB,conMatrix,conLB,conUB) + // x = qpipopt_mat(H,f) + // x = qpipopt_mat(H,f,A,b) + // x = qpipopt_mat(H,f,A,b,Aeq,beq) + // x = qpipopt_mat(H,f,A,b,Aeq,beq,lb,ub) + // [xopt,fopt,exitflag,output,lamda] = qpipopt_mat( ... ) + // + // Parameters + // H : a n x n matrix of doubles, where n is number of variables, represents coefficients of quadratic in the quadratic problem. + // f : a n x 1 matrix of doubles, where n is number of variables, represents coefficients of linear in the quadratic problem + // A : a m x n matrix of doubles, represents the linear coefficients in the inequality constraints + // b : a column vector of doubles, represents the linear coefficients in the inequality constraints + // Aeq : a meq x n matrix of doubles, represents the linear coefficients in the equality constraints + // beq : a vector of doubles, represents the linear coefficients in the equality constraints + // LB : a n x 1 matrix of doubles, where n is number of variables, contains lower bounds of the variables. + // UB : a n x 1 matrix of doubles, where n is number of variables, contains upper bounds of the variables. + // xopt : a nx1 matrix of doubles, the computed solution of the optimization problem. + // fopt : a 1x1 matrix of doubles, the function value at x. + // exitflag : Integer identifying the reason the algorithm terminated. + // output : Structure containing information about the optimization. + // lambda : Structure containing the Lagrange multipliers at the solution x (separated by constraint type). + // + // Description + // Search the minimum of a constrained linear quadratic optimization problem specified by : + // find the minimum of f(x) such that + // + // <latex> + // \begin{eqnarray} + // &\mbox{min}_{x} + // & 1/2*x'*H*x + f'*x \\ + // & \text{subject to} & A.x \leq b \\ + // & & Aeq.x \leq beq \\ + // & & lb \leq x \leq ub \\ + // \end{eqnarray} + // </latex> + // + // We are calling IPOpt for solving the quadratic problem, IPOpt is a library written in C++. The code has been written by Andreas Wächter and Carl Laird. + // + // Examples + // //Find x in R^6 such that: + // + // Aeq= [1,-1,1,0,3,1; + // -1,0,-3,-4,5,6; + // 2,5,3,0,1,0]; + // beq=[1; 2; 3]; + // A= [0,1,0,1,2,-1; + // -1,0,2,1,1,0]; + // b = [-1; 2.5]; + // lb=[-1000; -10000; 0; -1000; -1000; -1000]; + // ub=[10000; 100; 1.5; 100; 100; 1000]; + // //and minimize 0.5*x'*Q*x + p'*x with + // f=[1; 2; 3; 4; 5; 6]; H=eye(6,6); + // [xopt,fopt,exitflag,output,lambda]=qpipopt_mat(H,f,A,b,Aeq,beq,lb,ub) + // clear H f A b Aeq beq lb ub; + // + // Examples + // //Find the value of x that minimize following function + // // f(x) = 0.5*x1^2 + x2^2 - x1*x2 - 2*x1 - 6*x2 + // // Subject to: + // // x1 + x2 ≤ 2 + // // –x1 + 2x2 ≤ 2 + // // 2x1 + x2 ≤ 3 + // // 0 ≤ x1, 0 ≤ x2. + // H = [1 -1; -1 2]; + // f = [-2; -6]; + // A = [1 1; -1 2; 2 1]; + // b = [2; 2; 3]; + // lb = [0; 0]; + // ub = [%inf; %inf]; + // [xopt,fopt,exitflag,output,lambda] = qpipopt_mat(H,f,A,b,[],[],lb,ub) + // + // Authors + // Keyur Joshi, Saikiran, Iswarya, Harpreet Singh + + +//To check the number of input and output argument + [lhs , rhs] = argn(); + +//To check the number of argument given by user + if ( rhs < 2 | rhs == 3 | rhs == 5 | rhs == 7 | rhs > 8 ) then + errmsg = msprintf(gettext("%s: Unexpected number of input arguments : %d provided while should be in the set of [2 4 6 8]"), "qpipopt", rhs); + error(errmsg) + end + + H = varargin(1); + f = varargin(2); + nbVar = size(H,1); + + + if ( rhs<2 ) then + A = [] + b = [] + else + A = varargin(3); + b = varargin(4); + end + + if ( rhs<4 ) then + Aeq = [] + beq = [] + else + Aeq = varargin(5); + beq = varargin(6); + end + + if ( rhs<6 ) then + LB = repmat(-%inf,nbVar,1); + UB = repmat(%inf,nbVar,1); + else + LB = varargin(7); + UB = varargin(8); + end + + nbConInEq = size(A,1); + nbConEq = size(Aeq,1); + + //Checking the H matrix which needs to be a symmetric matrix + if ( H~=H') then + errmsg = msprintf(gettext("%s: H is not a symmetric matrix"), "qpipopt_mat"); + error(errmsg); + end + + //Check the size of H which should equal to the number of variable + if ( size(H) ~= [nbVar nbVar]) then + errmsg = msprintf(gettext("%s: The Size of H is not equal to the number of variables"), "qpipopt"); + error(errmsg); + end + + //Check the size of f which should equal to the number of variable + if ( size(f,1) ~= [nbVar]) then + errmsg = msprintf(gettext("%s: The Size of f is not equal to the number of variables"), "qpipopt"); + error(errmsg); + end + + + //Check the size of inequality constraint which should be equal to the number of variables + if ( size(A,2) ~= nbVar & size(A,2) ~= 0) then + errmsg = msprintf(gettext("%s: The size of inequality constraints is not equal to the number of variables"), "qpipopt"); + error(errmsg); + end + + //Check the size of equality constraint which should be equal to the number of variables + if ( size(Aeq,2) ~= nbVar & size(Aeq,2) ~= 0 ) then + errmsg = msprintf(gettext("%s: The size of equality constraints is not equal to the number of variables"), "qpipopt"); + error(errmsg); + end + + + //Check the size of Lower Bound which should be equal to the number of variables + if ( size(LB,1) ~= nbVar) then + errmsg = msprintf(gettext("%s: The Lower Bound is not equal to the number of variables"), "qpipopt"); + error(errmsg); + end + +//Check the size of Upper Bound which should equal to the number of variables + if ( size(UB,1) ~= nbVar) then + errmsg = msprintf(gettext("%s: The Upper Bound is not equal to the number of variables"), "qpipopt"); + error(errmsg); + end + +//Check the size of constraints of Lower Bound which should equal to the number of constraints + if ( size(b,1) ~= nbConInEq & size(b,1) ~= 0) then + errmsg = msprintf(gettext("%s: The Lower Bound of inequality constraints is not equal to the number of constraints"), "qpipopt"); + error(errmsg); + end + +//Check the size of constraints of Upper Bound which should equal to the number of constraints + if ( size(beq,1) ~= nbConEq & size(beq,1) ~= 0) then + errmsg = msprintf(gettext("%s: The Upper Bound of equality constraints is not equal to the number of constraints"), "qp_ipopt"); + error(errmsg); + end + + //Converting it into ipopt format + f = f'; + LB = LB'; + UB = UB'; + conMatrix = [Aeq;A]; + nbCon = size(conMatrix,1); + conLB = [beq; repmat(-%inf,nbConInEq,1)]'; + conUB = [beq;b]' ; + [xopt,fopt,status,iter,Zl,Zu,lmbda] = solveqp(nbVar,nbCon,H,f,conMatrix,conLB,conUB,LB,UB); + + xopt = xopt'; + exitflag = status; + output = struct("Iterations" , []); + output.Iterations = iter; + lambda = struct("lower" , [], .. + "upper" , [], .. + "ineqlin" , [], .. + "eqlin" , []); + + lambda.lower = Zl; + lambda.upper = Zu; + lambda.eqlin = lmbda(1:nbConEq); + lambda.ineqlin = lmbda(nbConEq+1:nbCon); + + +endfunction diff --git a/macros/symphony_mat.bin b/macros/symphony_mat.bin Binary files differindex 3b72644..600bd9a 100644 --- a/macros/symphony_mat.bin +++ b/macros/symphony_mat.bin diff --git a/macros/symphony_mat.sci b/macros/symphony_mat.sci index 068e9cf..b30d84d 100644 --- a/macros/symphony_mat.sci +++ b/macros/symphony_mat.sci @@ -153,7 +153,7 @@ function [xopt,fopt,status,iter] = symphony_mat (varargin) [lhs , rhs] = argn(); //To check the number of argument given by user - if ( rhs < 4 | rhs = 5 | rhs = 7 | rhs > 9 ) then + if ( rhs < 4 | rhs == 5 | rhs == 7 | rhs > 9 ) then errmsg = msprintf(gettext("%s: Unexpected number of input arguments : %d provided while should be in the set [4 6 8 9]"), "Symphony", rhs); error(errmsg) end |