diff options
Diffstat (limited to 'macros')
-rw-r--r-- | macros/lsqlin.bin | bin | 50916 -> 57812 bytes | |||
-rw-r--r-- | macros/lsqlin.sci | 45 | ||||
-rw-r--r-- | macros/lsqnonneg.bin | bin | 24024 -> 29824 bytes | |||
-rw-r--r-- | macros/lsqnonneg.sci | 47 | ||||
-rw-r--r-- | macros/qpipopt.bin | bin | 50352 -> 57148 bytes | |||
-rw-r--r-- | macros/qpipopt.sci | 51 | ||||
-rw-r--r-- | macros/qpipoptmat.bin | bin | 52688 -> 59596 bytes | |||
-rw-r--r-- | macros/qpipoptmat.sci | 489 | ||||
-rw-r--r-- | macros/symphony.bin | bin | 56296 -> 59376 bytes | |||
-rw-r--r-- | macros/symphony.sci | 25 | ||||
-rw-r--r-- | macros/symphony_call.bin | bin | 4592 -> 4592 bytes | |||
-rw-r--r-- | macros/symphony_call.sci | 14 | ||||
-rw-r--r-- | macros/symphonymat.bin | bin | 60688 -> 63876 bytes | |||
-rw-r--r-- | macros/symphonymat.sci | 33 |
14 files changed, 427 insertions, 277 deletions
diff --git a/macros/lsqlin.bin b/macros/lsqlin.bin Binary files differindex 1359535..67446ac 100644 --- a/macros/lsqlin.bin +++ b/macros/lsqlin.bin diff --git a/macros/lsqlin.sci b/macros/lsqlin.sci index 9460424..532e6ad 100644 --- a/macros/lsqlin.sci +++ b/macros/lsqlin.sci @@ -31,13 +31,13 @@ function [xopt,resnorm,residual,exitflag,output,lambda] = lsqlin (varargin) // lb : a vector of double, contains lower bounds of the variables. // ub : a vector of double, contains upper bounds of the variables. // x0 : a vector of double, contains initial guess of variables. - // param : a list containing the the parameters to be set. + // param : a list containing the parameters to be set. // xopt : a vector of double, the computed solution of the optimization problem. // resnorm : a double, objective value returned as the scalar value norm(C*x-d)^2. // residual : a vector of double, solution residuals returned as the vector d-C*x. - // exitflag : A flag showing returned exit flag from Ipopt. It could be 0, 1 or 2 etc. i.e. Optimal, Maximum Number of Iterations Exceeded, CPU time exceeded. Other flags one can see in the lsqlin macro. - // output : Structure containing information about the optimization. This version only contains number of iterations. - // lambda : Structure containing the Lagrange multipliers at the solution x (separated by constraint type).It contains lower, upper bound multiplier and linear equality, inequality constraint multiplier. + // exitflag : The exit status. See below for details. + // output : The structure consist of statistics about the optimization. See below for details. + // lambda : The structure consist of the Lagrange multipliers at the solution of problem. See below for details. // // Description // Search the minimum of a constrained linear least square problem specified by : @@ -54,6 +54,35 @@ function [xopt,resnorm,residual,exitflag,output,lambda] = lsqlin (varargin) // // The routine calls Ipopt for solving the linear least square problem, Ipopt 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 : Maximum Number of Iterations Exceeded. Output may not be optimal.</listitem> + // <listitem>exitflag=2 : Maximum CPU Time exceeded. Output may not be optimal.</listitem> + // <listitem>exitflag=3 : Stop at Tiny Step.</listitem> + // <listitem>exitflag=4 : Solved To Acceptable Level.</listitem> + // <listitem>exitflag=5 : Converged to a point of local infeasibility.</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 // //A simple linear least square example // C = [ 2 0; @@ -330,11 +359,13 @@ function [xopt,resnorm,residual,exitflag,output,lambda] = lsqlin (varargin) residual = d-C*xopt; resnorm = residual'*residual; exitflag = status; - output = struct("Iterations" , []); + output = struct("Iterations" , [], .. + "ConstrViolation" ,[]); output.Iterations = iter; + output.ConstrViolation = max([0;norm(Aeq*xopt-beq, 'inf');(lb'-xopt);(xopt-ub');(A*xopt-b)]); lambda = struct("lower" , [], .. - "upper" , [], .. - "eqlin" , [], .. + "upper" , [], .. + "eqlin" , [], .. "ineqlin" , []); lambda.lower = Zl; diff --git a/macros/lsqnonneg.bin b/macros/lsqnonneg.bin Binary files differindex b480250..bc44ed5 100644 --- a/macros/lsqnonneg.bin +++ b/macros/lsqnonneg.bin diff --git a/macros/lsqnonneg.sci b/macros/lsqnonneg.sci index 80ec92a..d95ee86 100644 --- a/macros/lsqnonneg.sci +++ b/macros/lsqnonneg.sci @@ -24,9 +24,9 @@ function [xopt,resnorm,residual,exitflag,output,lambda] = lsqnonneg (varargin) // xopt : a vector of double, the computed solution of the optimization problem. // resnorm : a double, objective value returned as the scalar value norm(C*x-d)^2. // residual : a vector of double, solution residuals returned as the vector d-C*x. - // exitflag : A flag showing returned exit flag from Ipopt. It could be 0, 1 or 2 etc. i.e. Optimal, Maximum Number of Iterations Exceeded, CPU time exceeded. Other flags one can see in the lsqlin macro. - // output : Structure containing information about the optimization. This version only contains number of iterations. - // lambda : Structure containing the Lagrange multipliers at the solution xopt. It contains lower, upper bound multiplier and linear equality, inequality constraint multiplier. + // exitflag : The exit status. See below for details. + // output : The structure consist of statistics about the optimization. See below for details. + // lambda : The structure consist of the Lagrange multipliers at the solution of problem. See below for details. // // Description // Solves nonnegative least-squares curve fitting problems specified by : @@ -40,6 +40,33 @@ function [xopt,resnorm,residual,exitflag,output,lambda] = lsqnonneg (varargin) // </latex> // // The routine calls Ipopt for solving the nonnegative least-squares curve fitting problems, Ipopt 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 : Maximum Number of Iterations Exceeded. Output may not be optimal.</listitem> + // <listitem>exitflag=2 : Maximum CPU Time exceeded. Output may not be optimal.</listitem> + // <listitem>exitflag=3 : Stop at Tiny Step.</listitem> + // <listitem>exitflag=4 : Solved To Acceptable Level.</listitem> + // <listitem>exitflag=5 : Converged to a point of local infeasibility.</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> + // </itemizedlist> // // Examples // // A basic lsqnonneg problem @@ -136,13 +163,15 @@ function [xopt,resnorm,residual,exitflag,output,lambda] = lsqnonneg (varargin) residual = -1*(C*xopt-d); resnorm = residual'*residual; exitflag = status; - output = struct("Iterations" , []); + output = struct("Iterations" , [], .. + "ConstrViolation" ,[]); output.Iterations = iter; - lambda = struct("lower" , [], .. - "upper" , []); - - lambda.lower = Zl; - lambda.upper = Zu; + output.ConstrViolation = max([0;(lb'-xopt);(xopt-ub')]); + + lambda = struct("lower" , [], .. + "upper" , []); + lambda.lower = Zl; + lambda.upper = Zu; select status case 0 then diff --git a/macros/qpipopt.bin b/macros/qpipopt.bin Binary files differindex 19a7040..71c0d8e 100644 --- a/macros/qpipopt.bin +++ b/macros/qpipopt.bin diff --git a/macros/qpipopt.sci b/macros/qpipopt.sci index e8c945a..33b31bb 100644 --- a/macros/qpipopt.sci +++ b/macros/qpipopt.sci @@ -26,16 +26,16 @@ function [xopt,fopt,exitflag,output,lambda] = qpipopt (varargin) // f : a vector of double, represents coefficients of linear in the quadratic problem // lb : a vector of double, contains lower bounds of the variables. // ub : a vector of double, contains upper bounds of the variables. - // A : a matrix of double, contains matrix representing the constraint matrix + // A : a matrix of double, contains the constraint matrix // conLB : a vector of double, contains lower bounds of the constraints. // conUB : a vector of double, contains upper bounds of the constraints. // x0 : a vector of double, contains initial guess of variables. - // param : a list containing the the parameters to be set. + // param : a list containing the parameters to be set. // xopt : a vector of double, the computed solution of the optimization problem. - // fopt : a double, the function value at x. - // exitflag : A flag showing returned exit flag from Ipopt. It could be 0, 1 or 2 etc. i.e. Optimal, Maximum Number of Iterations Exceeded, CPU time exceeded. Other flags one can see in the lsqlin macro. - // output : Structure containing information about the optimization. This version only contains number of iterations - // lambda : Structure containing the Lagrange multipliers at the solution x (separated by constraint type).It contains lower, upper bound multiplier and linear equality, inequality constraint multiplier. + // fopt : a double, the value of the function at x. + // exitflag : The exit status. See below for details. + // output : The structure consist of statistics about the optimization. See below for details. + // lambda : The structure consist of the Lagrange multipliers at the solution of problem. See below for details. // // Description // Search the minimum of a constrained linear quadratic optimization problem specified by : @@ -50,6 +50,35 @@ function [xopt,fopt,exitflag,output,lambda] = qpipopt (varargin) // </latex> // // The routine calls Ipopt for solving the quadratic problem, Ipopt 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 : Maximum Number of Iterations Exceeded. Output may not be optimal.</listitem> + // <listitem>exitflag=2 : Maximum CPU Time exceeded. Output may not be optimal.</listitem> + // <listitem>exitflag=3 : Stop at Tiny Step.</listitem> + // <listitem>exitflag=4 : Solved To Acceptable Level.</listitem> + // <listitem>exitflag=5 : Converged to a point of local infeasibility.</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 // //Ref : example 14 : @@ -316,12 +345,14 @@ function [xopt,fopt,exitflag,output,lambda] = qpipopt (varargin) end end - [xopt,fopt,status,iter,Zl,Zu,lmbda] = solveqp(nbVar,nbCon,H,f,A,conLB,conUB,lb,ub,x0,options); + [xopt,fopt,status,iter,Zl,Zu,lmbda] = solveqp(nbVar,nbCon,H,f,A,conLB,conUB,lb,ub,x0,options); xopt = xopt'; exitflag = status; - output = struct("Iterations" , []); - output.Iterations = iter; + output = struct("Iterations" , [], .. + "ConstrViolation" ,[]); + output.Iterations = iter; + output.ConstrViolation = max([0;(conLB'-A*xopt);(A*xopt - conUB');(lb'-xopt);(xopt-ub')]); lambda = struct("lower" , [], .. "upper" , [], .. "constraint" , []); @@ -331,7 +362,6 @@ function [xopt,fopt,exitflag,output,lambda] = qpipopt (varargin) lambda.constraint = lmbda; select status - case 0 then printf("\nOptimal Solution Found.\n"); case 1 then @@ -367,5 +397,4 @@ function [xopt,fopt,exitflag,output,lambda] = qpipopt (varargin) break; end - endfunction diff --git a/macros/qpipoptmat.bin b/macros/qpipoptmat.bin Binary files differindex 817f0f9..5dd2df1 100644 --- a/macros/qpipoptmat.bin +++ b/macros/qpipoptmat.bin diff --git a/macros/qpipoptmat.sci b/macros/qpipoptmat.sci index d019aa1..f501094 100644 --- a/macros/qpipoptmat.sci +++ b/macros/qpipoptmat.sci @@ -32,13 +32,13 @@ function [xopt,fopt,exitflag,output,lambda] = qpipoptmat (varargin) // lb : a vector of double, contains lower bounds of the variables. // ub : a vector of double, contains upper bounds of the variables. // x0 : a vector of double, contains initial guess of variables. - // param : a list containing the the parameters to be set. + // param : a list containing the parameters to be set. // xopt : a vector of double, the computed solution of the optimization problem. - // fopt : a double, the function value at x. + // fopt : a double, the value of the function at x. // residual : a vector of double, solution residuals returned as the vector d-C*x. - // exitflag : A flag showing returned exit flag from Ipopt. It could be 0, 1 or 2 etc. i.e. Optimal, Maximum Number of Iterations Exceeded, CPU time exceeded. Other flags one can see in the lsqlin macro. - // output : Structure containing information about the optimization. This version only contains number of iterations. - // lambda : Structure containing the Lagrange multipliers at the solution x (separated by constraint type).It contains lower, upper bound multiplier and linear equality, inequality constraint multiplier. + // exitflag : The exit status. See below for details. + // output : The structure consist of statistics about the optimization. See below for details. + // lambda : The structure consist of the Lagrange multipliers at the solution of problem. See below for details. // // Description // Search the minimum of a constrained linear quadratic optimization problem specified by : @@ -55,6 +55,35 @@ function [xopt,fopt,exitflag,output,lambda] = qpipoptmat (varargin) // // The routine calls Ipopt for solving the quadratic problem, Ipopt 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 : Maximum Number of Iterations Exceeded. Output may not be optimal.</listitem> + // <listitem>exitflag=2 : Maximum CPU Time exceeded. Output may not be optimal.</listitem> + // <listitem>exitflag=3 : Stop at Tiny Step.</listitem> + // <listitem>exitflag=4 : Solved To Acceptable Level.</listitem> + // <listitem>exitflag=5 : Converged to a point of local infeasibility.</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 // //Ref : example 14 : // //https://www.me.utexas.edu/~jensen/ORMM/supplements/methods/nlpmethod/S2_quadratic.pdf @@ -94,15 +123,15 @@ function [xopt,fopt,exitflag,output,lambda] = qpipoptmat (varargin) // 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 > 10 ) then - errmsg = msprintf(gettext("%s: Unexpected number of input arguments : %d provided while should be in the set of [2 4 6 8 9 10]"), "qpipoptmat", rhs); - error(errmsg) - end - + //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 > 10 ) then + errmsg = msprintf(gettext("%s: Unexpected number of input arguments : %d provided while should be in the set of [2 4 6 8 9 10]"), "qpipoptmat", rhs); + error(errmsg) + end + H = []; f = []; A = []; @@ -116,242 +145,240 @@ function [xopt,fopt,exitflag,output,lambda] = qpipoptmat (varargin) f = varargin(2); nbVar = size(H,1); - - if ( rhs<3 ) then - A = [] - b = [] - else - A = varargin(3); - b = varargin(4); - end - - if ( rhs<5 ) then - Aeq = [] - beq = [] - else - Aeq = varargin(5); - beq = varargin(6); - end - - if ( rhs<7 ) then - lb = repmat(-%inf,nbVar,1); - ub = repmat(%inf,nbVar,1); - else - lb = varargin(7); - ub = varargin(8); - end - - - if ( rhs<9 | size(varargin(9)) ==0 ) then - x0 = repmat(0,nbVar,1) - else - x0 = varargin(9); - end - - if ( rhs<10 | size(varargin(10)) ==0 ) then - param = list(); - else - param =varargin(10); - end - - if (size(lb,2)==0) then - lb = repmat(-%inf,nbVar,1); - end - - if (size(ub,2)==0) then - ub = repmat(%inf,nbVar,1); - end - if (size(f,2)==0) then - f = repmat(0,nbVar,1); - end + if ( rhs<3 ) then + A = [] + b = [] + else + A = varargin(3); + b = varargin(4); + end + + if ( rhs<5 ) then + Aeq = [] + beq = [] + else + Aeq = varargin(5); + beq = varargin(6); + end - if (type(param) ~= 15) then - errmsg = msprintf(gettext("%s: param should be a list "), "qpipoptmat"); - error(errmsg); - end - + if ( rhs<7 ) then + lb = repmat(-%inf,nbVar,1); + ub = repmat(%inf,nbVar,1); + else + lb = varargin(7); + ub = varargin(8); + end - if (modulo(size(param),2)) then - errmsg = msprintf(gettext("%s: Size of parameters should be even"), "qpipoptmat"); - error(errmsg); - end - - options = list(.. - "MaxIter" , [3000], ... - "CpuTime" , [600] ... - ); - - for i = 1:(size(param))/2 - - select param(2*i-1) - case "MaxIter" then - options(2*i) = param(2*i); - case "CpuTime" then - options(2*i) = param(2*i); - else - errmsg = msprintf(gettext("%s: Unrecognized parameter name ''%s''."), "qpipoptmat", param(2*i-1)); - error(errmsg) - end - end - - nbConInEq = size(A,1); - nbConEq = size(Aeq,1); - -// Check if the user gives row vector -// and Changing it to a column matrix - - - if (size(f,2)== [nbVar]) then - f=f'; - end - - if (size(lb,2)== [nbVar]) then - lb = lb'; - end + if ( rhs<9 | size(varargin(9)) ==0 ) then + x0 = repmat(0,nbVar,1) + else + x0 = varargin(9); + end - if (size(ub,2)== [nbVar]) then - ub = ub'; - end + if ( rhs<10 | size(varargin(10)) ==0 ) then + param = list(); + else + param =varargin(10); + end + + if (size(lb,2)==0) then + lb = repmat(-%inf,nbVar,1); + end - if (size(b,2)==nbConInEq) then - b = b'; - end + if (size(ub,2)==0) then + ub = repmat(%inf,nbVar,1); + end - if (size(beq,2)== nbConEq) then - beq = beq'; - end + if (size(f,2)==0) then + f = repmat(0,nbVar,1); + end - if (size(x0,2)== [nbVar]) then - x0=x0'; - end + if (type(param) ~= 15) then + errmsg = msprintf(gettext("%s: param should be a list "), "qpipoptmat"); + error(errmsg); + end - //Checking the H matrix which needs to be a symmetric matrix - if ( ~isequal(H,H')) then - errmsg = msprintf(gettext("%s: H is not a symmetric matrix"), "qpipoptmat"); - error(errmsg); - end + if (modulo(size(param),2)) then + errmsg = msprintf(gettext("%s: Size of parameters should be even"), "qpipoptmat"); + error(errmsg); + end + + options = list(.. + "MaxIter" , [3000], ... + "CpuTime" , [600] ... + ); + + for i = 1:(size(param))/2 + + select param(2*i-1) + case "MaxIter" then + options(2*i) = param(2*i); + case "CpuTime" then + options(2*i) = param(2*i); + else + errmsg = msprintf(gettext("%s: Unrecognized parameter name ''%s''."), "qpipoptmat", param(2*i-1)); + error(errmsg) + end + end + + nbConInEq = size(A,1); + nbConEq = size(Aeq,1); + + // Check if the user gives row vector + // and Changing it to a column matrix + + if (size(f,2)== [nbVar]) then + f=f'; + end + + if (size(lb,2)== [nbVar]) then + lb = lb'; + end + + if (size(ub,2)== [nbVar]) then + ub = ub'; + end + + if (size(b,2)==nbConInEq) then + b = b'; + end + + if (size(beq,2)== nbConEq) then + beq = beq'; + end + + if (size(x0,2)== [nbVar]) then + x0=x0'; + end + + //Checking the H matrix which needs to be a symmetric matrix + if ( ~isequal(H,H')) then + errmsg = msprintf(gettext("%s: H is not a symmetric matrix"), "qpipoptmat"); + 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 number of rows and columns in H must be equal the number of elements of f"), "qpipoptmat"); + 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 number of columns in A must be the same as the number of elements of f"), "qpipoptmat"); + 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 number of columns in Aeq must be the same as the number of elements of f"), "qpipoptmat"); + 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"), "qpipoptmat"); + 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"), "qpipoptmat"); + 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 number of rows in A must be the same as the number of elementsof b"), "qpipoptmat"); + 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 number of rows in Aeq must be the same as the number of elements of beq"), "qpipoptmat"); + error(errmsg); + end + + //Check the size of initial of variables which should equal to the number of variables + if ( size(x0,1) ~= nbVar) then + warnmsg = msprintf(gettext("%s: Ignoring initial guess of variables as it is not equal to the number of variables"), "qpipoptmat"); + warning(warnmsg); + x0 = repmat(0,nbVar,1); + end + + //Check if the user gives a matrix instead of a vector + + if ((size(f,1)~=1)& (size(f,2)~=1)) then + errmsg = msprintf(gettext("%s: f should be a vector"), "qpipoptmat"); + error(errmsg); + end + + if (size(lb,1)~=1)& (size(ub,2)~=1) then + errmsg = msprintf(gettext("%s: Lower Bound should be a vector"), "qpipoptmat"); + error(errmsg); + end + + if (size(ub,1)~=1)& (size(ub,2)~=1) then + errmsg = msprintf(gettext("%s: Upper Bound should be a vector"), "qpipoptmat"); + error(errmsg); + end + + if (nbConInEq) then + if ((size(b,1)~=1)& (size(b,2)~=1)) then + errmsg = msprintf(gettext("%s: Constraint Lower Bound should be a vector"), "qpipoptmat"); + error(errmsg); + end + end + + if (nbConEq) then + if (size(beq,1)~=1)& (size(beq,2)~=1) then + errmsg = msprintf(gettext("%s: Constraint should be a vector"), "qpipoptmat"); + error(errmsg); + end + 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 number of rows and columns in H must be equal the number of elements of f"), "qpipoptmat"); - 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 number of columns in A must be the same as the number of elements of f"), "qpipoptmat"); - 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 number of columns in Aeq must be the same as the number of elements of f"), "qpipoptmat"); - 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"), "qpipoptmat"); - 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"), "qpipoptmat"); - 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 number of rows in A must be the same as the number of elementsof b"), "qpipoptmat"); - 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 number of rows in Aeq must be the same as the number of elements of beq"), "qpipoptmat"); - error(errmsg); - end - - //Check the size of initial of variables which should equal to the number of variables - if ( size(x0,1) ~= nbVar) then - warnmsg = msprintf(gettext("%s: Ignoring initial guess of variables as it is not equal to the number of variables"), "qpipoptmat"); - warning(warnmsg); - x0 = repmat(0,nbVar,1); - end - - //Check if the user gives a matrix instead of a vector - - if ((size(f,1)~=1)& (size(f,2)~=1)) then - errmsg = msprintf(gettext("%s: f should be a vector"), "qpipoptmat"); - error(errmsg); - end - - if (size(lb,1)~=1)& (size(ub,2)~=1) then - errmsg = msprintf(gettext("%s: Lower Bound should be a vector"), "qpipoptmat"); - error(errmsg); - end - - if (size(ub,1)~=1)& (size(ub,2)~=1) then - errmsg = msprintf(gettext("%s: Upper Bound should be a vector"), "qpipoptmat"); - error(errmsg); - end - - if (nbConInEq) then - if ((size(b,1)~=1)& (size(b,2)~=1)) then - errmsg = msprintf(gettext("%s: Constraint Lower Bound should be a vector"), "qpipoptmat"); - error(errmsg); - end - end - - if (nbConEq) then - if (size(beq,1)~=1)& (size(beq,2)~=1) then - errmsg = msprintf(gettext("%s: Constraint should be a vector"), "qpipoptmat"); - error(errmsg); - end - end - for i = 1:nbConInEq if (b(i) == -%inf) errmsg = msprintf(gettext("%s: Value of b can not be negative infinity"), "qpipoptmat"); - error(errmsg); - end + error(errmsg); + end end - + for i = 1:nbConEq if (beq(i) == -%inf) errmsg = msprintf(gettext("%s: Value of beq can not be negative infinity"), "qpipoptmat"); - error(errmsg); - end + error(errmsg); + end end - //Converting it into ipopt format - f = f'; - lb = lb'; - ub = ub'; - x0 = x0'; - 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,x0,options); - - xopt = xopt'; - exitflag = status; - output = struct("Iterations" , []); - output.Iterations = iter; - lambda = struct("lower" , [], .. - "upper" , [], .. - "eqlin" , [], .. + //Converting it into ipopt format + f = f'; + lb = lb'; + ub = ub'; + x0 = x0'; + 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,x0,options); + xopt = xopt'; + exitflag = status; + output = struct("Iterations" , [], .. + "ConstrViolation" ,[]); + output.Iterations = iter; + output.ConstrViolation = max([0;norm(Aeq*xopt-beq, 'inf');(lb'-xopt);(xopt-ub');(A*xopt-b)]); + lambda = struct("lower" , [], .. + "upper" , [], .. + "eqlin" , [], .. "ineqlin" , []); - - lambda.lower = Zl; - lambda.upper = Zu; - lambda.eqlin = lmbda(1:nbConEq); - lambda.ineqlin = lmbda(nbConEq+1:nbCon); + + lambda.lower = Zl; + lambda.upper = Zu; + lambda.eqlin = lmbda(1:nbConEq); + lambda.ineqlin = lmbda(nbConEq+1:nbCon); select status diff --git a/macros/symphony.bin b/macros/symphony.bin Binary files differindex 87b6444..0259139 100644 --- a/macros/symphony.bin +++ b/macros/symphony.bin diff --git a/macros/symphony.sci b/macros/symphony.sci index d465b90..686eb5a 100644 --- a/macros/symphony.sci +++ b/macros/symphony.sci @@ -29,11 +29,11 @@ function [xopt,fopt,status,output] = symphony (varargin) // conLB : a vector of double, represents lower bounds of the constraints. // conUB : a vector of double, represents upper bounds of the constraints // objSense : The sense (maximization/minimization) of the objective. Use 1(sym_minimize ) or -1 (sym_maximize) here. - // options : a list containing the the parameters to be set. + // options : a list containing the parameters to be set. // xopt : a vector of double, the computed solution of the optimization problem. - // fopt : a double, the function value at x. - // status : status flag returned from symphony. 227 is optimal, 228 is Time limit exceeded, 230 is iteration limit exceeded. - // output : The output data structure contains detailed information about the optimization process. This version only contains number of iterations + // 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. // // Description // Search the minimum or maximum of a constrained mixed integer linear programming optimization problem specified by : @@ -50,6 +50,22 @@ function [xopt,fopt,status,output] = symphony (varargin) // // The routine calls SYMPHONY written in C by gateway files for the actual computation. // + // The status allows to know the status of the optimization which is given back by Ipopt. + // <itemizedlist> + // <listitem>status=227 : Optimal Solution Found </listitem> + // <listitem>status=228 : Maximum CPU Time exceeded.</listitem> + // <listitem>status=229 : Maximum Number of Node Limit Exceeded.</listitem> + // <listitem>status=230 : Maximum Number of Iterations Limit Exceeded.</listitem> + // </itemizedlist> + // + // For more details on status see the symphony documentation, go to http://www.coin-or.org/SYMPHONY/man-5.6/ + // + // 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> + // </itemizedlist> + // // Examples // //Reference: Westerberg, Carl-Henrik, Bengt Bjorklund, and Eskil Hultman. "An application of mixed integer programming in a Swedish steel mill." Interfaces 7, no. 2 (1977): 39-43. // // Objective function @@ -179,6 +195,7 @@ function [xopt,fopt,status,output] = symphony (varargin) A = []; conLB = []; conUB = []; + options = list(); nbVar = varargin(1); nbCon = varargin(2); diff --git a/macros/symphony_call.bin b/macros/symphony_call.bin Binary files differindex 53671fa..5e0d5e1 100644 --- a/macros/symphony_call.bin +++ b/macros/symphony_call.bin diff --git a/macros/symphony_call.sci b/macros/symphony_call.sci index af066f4..80b22d0 100644 --- a/macros/symphony_call.sci +++ b/macros/symphony_call.sci @@ -9,7 +9,7 @@ // Organization: FOSSEE, IIT Bombay // Email: toolbox@scilab.in -function [xopt,fopt,status,output] = symphony_call(nbVar,nbCon,objCoef,isInt,LB,UB,conMatrix,conLB,conUB,objSense,options) +function [xopt,fopt,status,output] = symphony_call(nbVar,nbCon,objCoef,isInt,lb,ub,A,conLB,conUB,objSense,options) xopt = []; fopt = []; @@ -23,12 +23,12 @@ function [xopt,fopt,status,output] = symphony_call(nbVar,nbCon,objCoef,isInt,LB, setOptions(options); //Choosing to launch basic or advanced version - if(~issparse(conMatrix)) then - sym_loadProblemBasic(nbVar,nbCon,LB,UB,objCoef,isInt,objSense,conMatrix,conLB,conUB); + if(~issparse(A)) then + sym_loadProblemBasic(nbVar,nbCon,lb,ub,objCoef,isInt,objSense,A,conLB,conUB); else // Changing to Constraint Matrix into sparse matrix - conMatrix_advanced=sparse(conMatrix); - sym_loadProblem(nbVar,nbCon,LB,UB,objCoef,isInt,objSense,conMatrix_advanced,conLB,conUB); + A_advanced=sparse(A); + sym_loadProblem(nbVar,nbCon,lb,ub,objCoef,isInt,objSense,A_advanced,conLB,conUB); end op = sym_solve(); @@ -44,8 +44,8 @@ function [xopt,fopt,status,output] = symphony_call(nbVar,nbCon,objCoef,isInt,LB, status = sym_getStatus(); - output = struct("Iterations" , []); - + output = struct("Iterations" , []); + output.Iterations = sym_getIterCount(); diff --git a/macros/symphonymat.bin b/macros/symphonymat.bin Binary files differindex eacbd5c..5534f4d 100644 --- a/macros/symphonymat.bin +++ b/macros/symphonymat.bin diff --git a/macros/symphonymat.sci b/macros/symphonymat.sci index 67e64c5..9dd11a8 100644 --- a/macros/symphonymat.sci +++ b/macros/symphonymat.sci @@ -28,11 +28,11 @@ function [xopt,fopt,status,iter] = symphonymat (varargin) // beq : Linear equality constraint vector, specified as a vector of double. beq represents the constant vector in the constraints Aeq*x = beq. beq has size equals to the number of rows in Aeq. // 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 the parameters to be set. + // options : a list containing the parameters to be set. // xopt : a vector of double, the computed solution of the optimization problem. - // fopt : a double, the function value at x - // status : status flag returned from symphony. 227 is optimal, 228 is Time limit exceeded, 230 is iteration limit exceeded. - // output : The output data structure contains detailed information about the optimization process. This version only contains number of iterations. + // 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. // // Description // Search the minimum or maximum of a constrained mixed integer linear programming optimization problem specified by : @@ -50,6 +50,22 @@ function [xopt,fopt,status,iter] = symphonymat (varargin) // // The routine calls SYMPHONY written in C by gateway files for the actual computation. // + // The status allows to know the status of the optimization which is given back by Ipopt. + // <itemizedlist> + // <listitem>status=227 : Optimal Solution Found </listitem> + // <listitem>status=228 : Maximum CPU Time exceeded.</listitem> + // <listitem>status=229 : Maximum Number of Node Limit Exceeded.</listitem> + // <listitem>status=230 : Maximum Number of Iterations Limit Exceeded.</listitem> + // </itemizedlist> + // + // For more details on status see the symphony documentation, go to http://www.coin-or.org/SYMPHONY/man-5.6/ + // + // 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> + // </itemizedlist> + // // Examples // // Objective function // // Reference: Westerberg, Carl-Henrik, Bengt Bjorklund, and Eskil Hultman. "An application of mixed integer programming in a Swedish steel mill." Interfaces 7, no. 2 (1977): 39-43. @@ -60,8 +76,8 @@ function [xopt,fopt,status,iter] = symphonymat (varargin) // ub = [repmat(1,1,4) repmat(%inf,1,4)]; // // Constraint Matrix // Aeq = [5,3,4,6,1,1,1,1; - // 5*0.05,3*0.04,4*0.05,6*0.03,0.08,0.07,0.06,0.03; - // 5*0.03,3*0.03,4*0.04,6*0.04,0.06,0.07,0.08,0.09;] + // 5*0.05,3*0.04,4*0.05,6*0.03,0.08,0.07,0.06,0.03; + // 5*0.03,3*0.03,4*0.04,6*0.04,0.06,0.07,0.08,0.09;] // beq = [ 25, 1.25, 1.25] // intcon = [1 2 3 4]; // // Calling Symphony @@ -170,6 +186,7 @@ function [xopt,fopt,status,iter] = symphonymat (varargin) beq = []; lb = []; ub = []; + options = list(); c = varargin(1) intcon = varargin(2) @@ -212,7 +229,7 @@ function [xopt,fopt,status,iter] = symphonymat (varargin) end if (size(intcon,2)==0) then - intcon = 0; + intcon = []; end if (size(ub,2)==0) then @@ -309,7 +326,7 @@ function [xopt,fopt,status,iter] = symphonymat (varargin) //Check if the user gives a matrix instead of a vector - if ((size(intcon,1)~=1)& (size(intcon,2)~=1)) then + if (((size(intcon,1)~=1)& (size(intcon,2)~=1))&(size(intcon,2)~=0)) then errmsg = msprintf(gettext("%s: intcon should be a vector"), "symphonymat"); error(errmsg); end |