summaryrefslogtreecommitdiff
path: root/macros/qpipoptmat.sci
diff options
context:
space:
mode:
authorHarpreet2015-11-02 16:20:08 +0530
committerHarpreet2015-11-02 16:20:08 +0530
commit29e8e8bbd43892c7fa146c165fdf128f786d6a7b (patch)
treeedeacf24d149d777859c2eff9661d04c7bd2f93d /macros/qpipoptmat.sci
parenteb054c02e76fa28638b595865f5eda52277b70be (diff)
downloadsymphony-29e8e8bbd43892c7fa146c165fdf128f786d6a7b.tar.gz
symphony-29e8e8bbd43892c7fa146c165fdf128f786d6a7b.tar.bz2
symphony-29e8e8bbd43892c7fa146c165fdf128f786d6a7b.zip
README.rst added
Diffstat (limited to 'macros/qpipoptmat.sci')
-rw-r--r--macros/qpipoptmat.sci74
1 files changed, 65 insertions, 9 deletions
diff --git a/macros/qpipoptmat.sci b/macros/qpipoptmat.sci
index 2f3e911..6ae20c0 100644
--- a/macros/qpipoptmat.sci
+++ b/macros/qpipoptmat.sci
@@ -14,11 +14,12 @@ function [xopt,fopt,exitflag,output,lambda] = qpipoptmat (varargin)
// Solves a linear quadratic problem.
//
// Calling Sequence
- // xopt = qpipoptmat(nbVar,nbCon,Q,p,LB,UB,conMatrix,conLB,conUB)
// x = qpipoptmat(H,f)
// x = qpipoptmat(H,f,A,b)
// x = qpipoptmat(H,f,A,b,Aeq,beq)
// x = qpipoptmat(H,f,A,b,Aeq,beq,lb,ub)
+ // x = qpipoptmat(H,f,A,b,Aeq,beq,lb,ub,x0)
+ // x = qpipoptmat(H,f,A,b,Aeq,beq,lb,ub,x0,param)
// [xopt,fopt,exitflag,output,lamda] = qpipoptmat( ... )
//
// Parameters
@@ -30,6 +31,8 @@ function [xopt,fopt,exitflag,output,lambda] = qpipoptmat (varargin)
// 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.
+ // x0 : a m x 1 matrix of doubles, where m is number of constraints, contains initial guess of variables.
+ // param : a list containing the the parameters to be set.
// 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.
@@ -64,9 +67,11 @@ function [xopt,fopt,exitflag,output,lambda] = qpipoptmat (varargin)
// b = [-1; 2.5];
// lb=[-1000; -10000; 0; -1000; -1000; -1000];
// ub=[10000; 100; 1.5; 100; 100; 1000];
+ // x0 = repmat(0,6,1);
+ // param = list("MaxIter", 300, "CpuTime", 100);
// //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]=qpipoptmat(H,f,A,b,Aeq,beq,lb,ub)
+ // [xopt,fopt,exitflag,output,lambda]=qpipoptmat(H,f,A,b,Aeq,beq,lb,ub,[],param)
// clear H f A b Aeq beq lb ub;
//
// Examples
@@ -93,8 +98,8 @@ function [xopt,fopt,exitflag,output,lambda] = qpipoptmat (varargin)
[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);
+ 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
@@ -126,7 +131,50 @@ function [xopt,fopt,exitflag,output,lambda] = qpipoptmat (varargin)
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 ) then
+ param = list();
+ else
+ param =varargin(10);
+ end
+
+
+ if (modulo(size(param),2)) then
+ errmsg = msprintf(gettext("%s: Size of parameters should be even"), "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-1) = param(2*i);
+ case "CpuTime" then
+ options(2*i-1) = 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);
@@ -168,33 +216,41 @@ function [xopt,fopt,exitflag,output,lambda] = qpipoptmat (varargin)
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,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
+ //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"), "qpipoptmat");
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(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"), "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
+ errmsg = msprintf(gettext("%s: The initial guess of variables is not equal to the number of variables"), "qpipoptmat");
+ error(errmsg);
+ 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);
+ [xopt,fopt,status,iter,Zl,Zu,lmbda] = solveqp(nbVar,nbCon,H,f,conMatrix,conLB,conUB,LB,UB,x0,options);
xopt = xopt';
exitflag = status;