summaryrefslogtreecommitdiff
path: root/macros
diff options
context:
space:
mode:
Diffstat (limited to 'macros')
-rw-r--r--macros/lsqlin.binbin50916 -> 57812 bytes
-rw-r--r--macros/lsqlin.sci45
-rw-r--r--macros/lsqnonneg.binbin24024 -> 29824 bytes
-rw-r--r--macros/lsqnonneg.sci47
-rw-r--r--macros/qpipopt.binbin50352 -> 57148 bytes
-rw-r--r--macros/qpipopt.sci51
-rw-r--r--macros/qpipoptmat.binbin52688 -> 59596 bytes
-rw-r--r--macros/qpipoptmat.sci489
-rw-r--r--macros/symphony.binbin56296 -> 59376 bytes
-rw-r--r--macros/symphony.sci25
-rw-r--r--macros/symphony_call.binbin4592 -> 4592 bytes
-rw-r--r--macros/symphony_call.sci14
-rw-r--r--macros/symphonymat.binbin60688 -> 63876 bytes
-rw-r--r--macros/symphonymat.sci33
14 files changed, 427 insertions, 277 deletions
diff --git a/macros/lsqlin.bin b/macros/lsqlin.bin
index 1359535..67446ac 100644
--- a/macros/lsqlin.bin
+++ b/macros/lsqlin.bin
Binary files differ
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
index b480250..bc44ed5 100644
--- a/macros/lsqnonneg.bin
+++ b/macros/lsqnonneg.bin
Binary files differ
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
index 19a7040..71c0d8e 100644
--- a/macros/qpipopt.bin
+++ b/macros/qpipopt.bin
Binary files differ
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
index 817f0f9..5dd2df1 100644
--- a/macros/qpipoptmat.bin
+++ b/macros/qpipoptmat.bin
Binary files differ
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
index 87b6444..0259139 100644
--- a/macros/symphony.bin
+++ b/macros/symphony.bin
Binary files differ
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
index 53671fa..5e0d5e1 100644
--- a/macros/symphony_call.bin
+++ b/macros/symphony_call.bin
Binary files differ
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
index eacbd5c..5534f4d 100644
--- a/macros/symphonymat.bin
+++ b/macros/symphonymat.bin
Binary files differ
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