summaryrefslogtreecommitdiff
path: root/newstructure/macros/intfmincon.sci
diff options
context:
space:
mode:
Diffstat (limited to 'newstructure/macros/intfmincon.sci')
-rw-r--r--newstructure/macros/intfmincon.sci589
1 files changed, 0 insertions, 589 deletions
diff --git a/newstructure/macros/intfmincon.sci b/newstructure/macros/intfmincon.sci
deleted file mode 100644
index cd234de..0000000
--- a/newstructure/macros/intfmincon.sci
+++ /dev/null
@@ -1,589 +0,0 @@
-// Copyright (C) 2015 - IIT Bombay - FOSSEE
-//
-// This file must be used under the terms of the CeCILL.
-// This source file is licensed as described in the file COPYING, which
-// you should have received as part of this distribution. The terms
-// are also available at
-// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
-// Author: Harpreet Singh, Pranav Deshpande and Akshay Miterani
-// Organization: FOSSEE, IIT Bombay
-// Email: toolbox@scilab.in
-
-function [xopt,fopt,exitflag,gradient,hessian] = intfmincon (varargin)
- // Solves a constrainted multi-variable mixed integer non linear programming problem
- //
- // Calling Sequence
- // xopt = intfmincon(f,x0,intcon,A,b)
- // xopt = intfmincon(f,x0,intcon,A,b,Aeq,beq)
- // xopt = intfmincon(f,x0,intcon,A,b,Aeq,beq,lb,ub)
- // xopt = intfmincon(f,x0,intcon,A,b,Aeq,beq,lb,ub,nlc)
- // xopt = intfmincon(f,x0,intcon,A,b,Aeq,beq,lb,ub,nlc,options)
- // [xopt,fopt] = intfmincon(.....)
- // [xopt,fopt,exitflag]= intfmincon(.....)
- // [xopt,fopt,exitflag,gradient]=intfmincon(.....)
- // [xopt,fopt,exitflag,gradient,hessian]=intfmincon(.....)
- //
- // Parameters
- // f : a function, representing the objective function of the problem
- // x0 : a vector of doubles, containing the starting values of variables.
- // intcon : a vector of integers, represents which variables are constrained to be integers
- // A : a matrix of double, represents the linear coefficients in the inequality constraints A⋅x ≤ b.
- // b : a vector of double, represents the linear coefficients in the inequality constraints A⋅x ≤ b.
- // Aeq : a matrix of double, represents the linear coefficients in the equality constraints Aeq⋅x = beq.
- // beq : a vector of double, represents the linear coefficients in the equality constraints Aeq⋅x = beq.
- // lb : Lower bounds, specified as a vector or array of double. lb represents the lower bounds elementwise in lb ≤ x ≤ ub.
- // ub : Upper bounds, specified as a vector or array of double. ub represents the upper bounds elementwise in lb ≤ x ≤ ub.
- // nlc : a function, representing the Non-linear Constraints functions(both Equality and Inequality) of the problem. It is declared in such a way that non-linear inequality constraints are defined first as a single row vector (c), followed by non-linear equality constraints as another single row vector (ceq). Refer Example for definition of Constraint function.
- // options : a list, containing the option for user to specify. See below for details.
- // xopt : a vector of doubles, containing the the computed solution of the optimization problem.
- // fopt : a scalar of double, containing the the function value at x.
- // exitflag : a scalar of integer, containing the flag which denotes the reason for termination of algorithm. See below for details.
- // gradient : a vector of doubles, containing the Objective's gradient of the solution.
- // hessian : a matrix of doubles, containing the Objective's hessian of the solution.
- //
- // Description
- // Search the minimum of a mixed integer constrained optimization problem specified by :
- // Find the minimum of f(x) such that
- //
- // <latex>
- // \begin{eqnarray}
- // &\mbox{min}_{x}
- // & f(x) \\
- // & \text{subject to} & A*x \leq b \\
- // & & Aeq*x \ = beq\\
- // & & c(x) \leq 0\\
- // & & ceq(x) \ = 0\\
- // & & lb \leq x \leq ub \\
- // & & x_i \in \!\, \mathbb{Z}, i \in \!\, I
- // \end{eqnarray}
- // </latex>
- //
- // The routine calls Bonmin for solving the Bounded Optimization problem, Bonmin is a library written in C++.
- //
- // The options allows the user to set various parameters of the Optimization problem.
- // It should be defined as type "list" and contains the following fields.
- // <itemizedlist>
- // <listitem>Syntax : options= list("IntegerTolerance", [---], "MaxNodes",[---], "MaxIter", [---], "AllowableGap",[---] "CpuTime", [---],"gradobj", "off", "hessian", "off" );</listitem>
- // <listitem>IntegerTolerance : a Scalar, a number with that value of an integer is considered integer..</listitem>
- // <listitem>MaxNodes : a Scalar, containing the Maximum Number of Nodes that the solver should search.</listitem>
- // <listitem>CpuTime : a Scalar, containing the Maximum amount of CPU Time that the solver should take.</listitem>
- // <listitem>AllowableGap : a Scalar, to stop the tree search when the gap between the objective value of the best known solution is reached.</listitem>
- // <listitem>MaxIter : a Scalar, containing the Maximum Number of Iteration that the solver should take.</listitem>
- // <listitem>gradobj : a string, to turn on or off the user supplied objective gradient.</listitem>
- // <listitem>hessian : a Scalar, to turn on or off the user supplied objective hessian.</listitem>
- // <listitem>Default Values : options = list('integertolerance',1d-06,'maxnodes',2147483647,'cputime',1d10,'allowablegap',0,'maxiter',2147483647,'gradobj',"off",'hessian',"off")</listitem>
- // </itemizedlist>
- //
- // 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 : InFeasible Solution.</listitem>
- // <listitem>exitflag=2 : Objective Function is Continuous Unbounded.</listitem>
- // <listitem>exitflag=3 : Limit Exceeded.</listitem>
- // <listitem>exitflag=4 : User Interrupt.</listitem>
- // <listitem>exitflag=5 : MINLP Error.</listitem>
- // </itemizedlist>
- //
- // For more details on exitflag see the Bonmin documentation, go to http://www.coin-or.org/Bonmin
- //
- // Examples
- // //Find x in R^2 such that it minimizes:
- // //f(x)= -x1 -x2/3
- // //x0=[0,0]
- // //constraint-1 (c1): x1 + x2 <= 2
- // //constraint-2 (c2): x1 + x2/4 <= 1
- // //constraint-3 (c3): x1 - x2 <= 2
- // //constraint-4 (c4): -x1/4 - x2 <= 1
- // //constraint-5 (c5): -x1 - x2 <= -1
- // //constraint-6 (c6): -x1 + x2 <= 2
- // //constraint-7 (c7): x1 + x2 = 2
- // //Objective function to be minimised
- // function [y,dy]=f(x)
- // y=-x(1)-x(2)/3;
- // dy= [-1,-1/3];
- // endfunction
- // //Starting point, linear constraints and variable bounds
- // x0=[0 , 0];
- // intcon = [1]
- // A=[1,1 ; 1,1/4 ; 1,-1 ; -1/4,-1 ; -1,-1 ; -1,1];
- // b=[2;1;2;1;-1;2];
- // Aeq=[1,1];
- // beq=[2];
- // lb=[];
- // ub=[];
- // nlc=[];
- // //Options
- // options=list("GradObj", "on");
- // //Calling Ipopt
- // [x,fval,exitflag,grad,hessian] =intfmincon(f, x0,intcon,A,b,Aeq,beq,lb,ub,nlc,options)
- // // Press ENTER to continue
- //
- // Examples
- // //Find x in R^3 such that it minimizes:
- // //f(x)= x1*x2 + x2*x3
- // //x0=[0.1 , 0.1 , 0.1]
- // //constraint-1 (c1): x1^2 - x2^2 + x3^2 <= 2
- // //constraint-2 (c2): x1^2 + x2^2 + x3^2 <= 10
- // //Objective function to be minimised
- // function [y,dy]=f(x)
- // y=x(1)*x(2)+x(2)*x(3);
- // dy= [x(2),x(1)+x(3),x(2)];
- // endfunction
- // //Starting point, linear constraints and variable bounds
- // x0=[0.1 , 0.1 , 0.1];
- // intcon = [2]
- // A=[];
- // b=[];
- // Aeq=[];
- // beq=[];
- // lb=[];
- // ub=[];
- // //Nonlinear constraints
- // function [c,ceq,cg,cgeq]=nlc(x)
- // c = [x(1)^2 - x(2)^2 + x(3)^2 - 2 , x(1)^2 + x(2)^2 + x(3)^2 - 10];
- // ceq = [];
- // cg=[2*x(1) , -2*x(2) , 2*x(3) ; 2*x(1) , 2*x(2) , 2*x(3)];
- // cgeq=[];
- // endfunction
- // //Options
- // options=list("MaxIter", [1500], "CpuTime", [500], "GradObj", "on","GradCon", "on");
- // //Calling Ipopt
- // [x,fval,exitflag,output] =intfmincon(f, x0,intcon,A,b,Aeq,beq,lb,ub,nlc,options)
- // // Press ENTER to continue
- //
- // Examples
- // //The below problem is an unbounded problem:
- // //Find x in R^3 such that it minimizes:
- // //f(x)= -(x1^2 + x2^2 + x3^2)
- // //x0=[0.1 , 0.1 , 0.1]
- // // x1 <= 0
- // // x2 <= 0
- // // x3 <= 0
- // //Objective function to be minimised
- // function y=f(x)
- // y=-(x(1)^2+x(2)^2+x(3)^2);
- // endfunction
- // //Starting point, linear constraints and variable bounds
- // x0=[0.1 , 0.1 , 0.1];
- // intcon = [3]
- // A=[];
- // b=[];
- // Aeq=[];
- // beq=[];
- // lb=[];
- // ub=[0,0,0];
- // //Options
- // options=list("MaxIter", [1500], "CpuTime", [500]);
- // //Calling Ipopt
- // [x,fval,exitflag,grad,hessian] =intfmincon(f, x0,intcon,A,b,Aeq,beq,lb,ub,[],options)
- // // Press ENTER to continue
- //
- // Examples
- // //The below problem is an infeasible problem:
- // //Find x in R^3 such that in minimizes:
- // //f(x)=x1*x2 + x2*x3
- // //x0=[1,1,1]
- // //constraint-1 (c1): x1^2 <= 1
- // //constraint-2 (c2): x1^2 + x2^2 <= 1
- // //constraint-3 (c3): x3^2 <= 1
- // //constraint-4 (c4): x1^3 = 0.5
- // //constraint-5 (c5): x2^2 + x3^2 = 0.75
- // // 0 <= x1 <=0.6
- // // 0.2 <= x2 <= inf
- // // -inf <= x3 <= 1
- // //Objective function to be minimised
- // function [y,dy]=f(x)
- // y=x(1)*x(2)+x(2)*x(3);
- // dy= [x(2),x(1)+x(3),x(2)];
- // endfunction
- // //Starting point, linear constraints and variable bounds
- // x0=[1,1,1];
- // intcon = [2]
- // A=[];
- // b=[];
- // Aeq=[];
- // beq=[];
- // lb=[0 0.2,-%inf];
- // ub=[0.6 %inf,1];
- // //Nonlinear constraints
- // function [c,ceq,cg,cgeq]=nlc(x)
- // c=[x(1)^2-1,x(1)^2+x(2)^2-1,x(3)^2-1];
- // ceq=[x(1)^3-0.5,x(2)^2+x(3)^2-0.75];
- // cg = [2*x(1),0,0;2*x(1),2*x(2),0;0,0,2*x(3)];
- // cgeq = [3*x(1)^2,0,0;0,2*x(2),2*x(3)];
- // endfunction
- // //Options
- // options=list("MaxIter", [1500], "CpuTime", [500], "GradObj", "on","GradCon", "on");
- // //Calling Ipopt
- // [x,fval,exitflag,grad,hessian] =intfmincon(f, x0,intcon,A,b,Aeq,beq,lb,ub,nlc,options)
- // // Press ENTER to continue
- // Authors
- // Harpreet Singh
-
- //To check the number of input and output arguments
- [lhs , rhs] = argn();
-
- //To check the number of arguments given by the user
- if ( rhs<4 | rhs>11 ) then
- errmsg = msprintf(gettext("%s: Unexpected number of input arguments : %d provided while should be int [4 5] "), "intfmincon", rhs);
- error(errmsg);
- end
-
- //Storing the Input Parameters
- fun = varargin(1);
- x0 = varargin(2);
- intcon = varargin(3);
- A = varargin(4);
- b = varargin(5);
- Aeq = [];
- beq = [];
- lb = [];
- ub = [];
- nlc = [];
-
- if (rhs>5) then
- Aeq = varargin(6);
- beq = varargin(7);
- end
-
- if (rhs>7) then
- lb = varargin(8);
- ub = varargin(9);
- end
-
- if (rhs>9) then
- nlc = varargin(10);
- end
-
- param = list();
- //To check whether options has been entered by user
- if ( rhs> 10) then
- param =varargin(11);
- end
-
- //To check whether the Input arguments
- Checktype("intfmincon", fun, "fun", 1, "function");
- Checktype("intfmincon", x0, "x0", 2, "constant");
- Checktype("intfmincon", intcon, "intcon", 3, "constant");
- Checktype("intfmincon", A, "A", 4, "constant");
- Checktype("intfmincon", b, "b", 5, "constant");
- Checktype("intfmincon", Aeq, "Aeq", 6, "constant");
- Checktype("intfmincon", beq, "beq", 7, "constant");
- Checktype("intfmincon", lb, "lb", 8, "constant");
- Checktype("intfmincon", ub, "ub", 9, "constant");
- Checktype("intfmincon", nlc, "nlc", 10, ["constant","function"]);
- Checktype("intfmincon", param, "options", 11, "list");
-
-
- nbVar = size(x0,"*");
- if(nbVar==0) then
- errmsg = msprintf(gettext("%s: x0 cannot be an empty"), "intfmincon");
- error(errmsg);
- end
-
- if(size(lb,"*")==0) then
- lb = repmat(-%inf,nbVar,1);
- end
-
- if(size(ub,"*")==0) then
- ub = repmat(%inf,nbVar,1);
- end
-
- //////////////// To Check linear constraints /////////
-
- //To check for correct size of A(3rd paramter)
- if(size(A,2)~=nbVar & size(A,2)~=0) then
- errmsg = msprintf(gettext("%s: Expected Matrix of size (No of linear inequality constraints X No of Variables) or an Empty Matrix for Linear Inequality Constraint coefficient Matrix A"), intfmincon);
- error(errmsg);
- end
- nbConInEq=size(A,"r");
-
- //To check for the correct size of Aeq (5th paramter)
- if(size(Aeq,2)~=nbVar & size(Aeq,2)~=0) then
- errmsg = msprintf(gettext("%s: Expected Matrix of size (No of linear equality constraints X No of Variables) or an Empty Matrix for Linear Equality Constraint coefficient Matrix Aeq"), intfmincon);
- error(errmsg);
- end
- nbConEq=size(Aeq,"r");
-
- ///////////////// To check vectors /////////////////
-
- Checkvector("intfmincon", x0, "x0", 2, nbVar);
- x0 = x0(:);
- if(size(intcon,"*")) then
- Checkvector("intfmincon", intcon, "intcon", 3, size(intcon,"*"))
- intcon = intcon(:);
- end
- if(nbConInEq) then
- Checkvector("intfmincon", b, "b", 5, nbConInEq);
- b = b(:);
- end
- if(nbConEq) then
- Checkvector("intfmincon", beq, "beq", 7, nbConEq);
- beq = beq(:);
- end
- Checkvector("intfmincon", lb, "lb", 8, nbVar);
- lb = lb(:);
-
- Checkvector("intfmincon", ub, "ub", 9, nbVar);
- ub = ub(:);
-
- /////////////// To check integer //////////////////////
- for i=1:size(intcon,1)
- if(intcon(i)>nbVar) then
- errmsg = msprintf(gettext("%s: The values inside intcon should be less than the number of variables"), "intfmincon");
- error(errmsg);
- end
-
- if (intcon(i)<0) then
- errmsg = msprintf(gettext("%s: The values inside intcon should be greater than 0 "), "intfmincon");
- error(errmsg);
- end
-
- if(modulo(intcon(i),1)) then
- errmsg = msprintf(gettext("%s: The values inside intcon should be an integer "), "intfmincon");
- error(errmsg);
- end
- end
-
-options = list('integertolerance',1d-06,'maxnodes',2147483647,'cputime',1d10,'allowablegap',0,'maxiter',2147483647,'gradobj',"off",'hessian',"off",'gradcon',"off")
-
- //Pushing param into default value
-
- for i = 1:(size(param))/2
- select convstr(param(2*i-1),'l')
- case 'integertolerance' then
- Checktype("intfmincon_options", param(2*i), param(2*i-1), 2*i, "constant");
- options(2) = param(2*i);
- case 'maxnodes' then
- Checktype("intfmincon_options", param(2*i), param(2*i-1), 2*i, "constant");
- options(4) = param(2*i);
- case 'cputime' then
- Checktype("intfmincon_options", param(2*i), param(2*i-1), 2*i, "constant");
- options(6) = param(2*i);
- case 'allowablegap' then
- Checktype("intfmincon_options", param(2*i), param(2*i-1), 2*i, "constant");
- options(8) = param(2*i);
- case 'maxiter' then
- Checktype("intfmincon_options", param(2*i), param(2*i-1), 2*i, "constant");
- options(10) = param(2*i);
- case 'gradobj' then
- Checktype("intfmincon_options", param(2*i), param(2*i-1), 2*i, "string");
- if(convstr(param(2*i),'l') == "on") then
- options(12) = "on"
- elseif(convstr(param(2*i),'l') == "off") then
- options(12) = "off"
- else
- error(999, 'Unknown string passed in gradobj.');
- end
- case 'hessian' then
- Checktype("intfmincon_options", param(2*i), param(2*i-1), 2*i, "function");
- options(14) = param(2*i);
- case 'gradcon' then
- Checktype("intfmincon_options", param(2*i), param(2*i-1), 2*i, "string");
- if(convstr(param(2*i),'l') == "on") then
- options(16) = "on"
- elseif(convstr(param(2*i),'l') == "off") then
- options(16) = "off"
- else
- error(999, 'Unknown string passed in gradcon.');
- end
- else
- error(999, 'Unknown string argument passed.');
- end
- end
-
- ///////////////// Functions Check /////////////////
-
- //To check the match between f (1st Parameter) and x0 (2nd Parameter)
- if(execstr('init=fun(x0)','errcatch')==21) then
- errmsg = msprintf(gettext("%s: Objective function and x0 did not match"), "intfmincon");
- error(errmsg);
- end
-
- if(options(12) == "on") then
- if(execstr('[grad_y,grad_dy]=fun(x0)','errcatch')==59) then
- errmsg = msprintf(gettext("%s: Gradient of objective function is not provided"), "intfmincon");
- error(errmsg);
- end
- if(grad_dy<>[]) then
- Checkvector("intfmincon_options", grad_dy, "dy", 12, nbVar);
- end
- end
-
- if(options(14) == "on") then
- if(execstr('[hessian_y,hessian_dy,hessian]=fun(x0)','errcatch')==59) then
- errmsg = msprintf(gettext("%s: Gradient of objective function is not provided"), "intfmincon");
- error(errmsg);
- end
- if ( ~isequal(size(hessian) == [nbVar nbVar]) ) then
- errmsg = msprintf(gettext("%s: Size of hessian should be nbVar X nbVar"), "intfmincon");
- error(errmsg);
- end
- end
-
- numNlic = 0;
- numNlec = 0;
- numNlc = 0;
-
- if (type(nlc) == 13 | type(nlc) == 11) then
- [sample_c,sample_ceq] = nlc(x0);
- if(execstr('[sample_c,sample_ceq] = nlc(x0)','errcatch')==21) then
- errmsg = msprintf(gettext("%s: Non-Linear Constraint function and x0 did not match"), intfmincon);
- error(errmsg);
- end
- numNlic = size(sample_c,"*");
- numNlec = size(sample_ceq,"*");
- numNlc = numNlic + numNlec;
- end
-
- /////////////// Creating conLb and conUb ////////////////////////
-
- conLb = [repmat(-%inf,numNlic,1);repmat(0,numNlec,1);repmat(-%inf,nbConInEq,1);beq;]
- conUb = [repmat(0,numNlic,1);repmat(0,numNlec,1);b;beq;]
-
- //Converting the User defined Objective function into Required form (Error Detectable)
- function [y,check] = _f(x)
- try
- y=fun(x)
- [y,check] = checkIsreal(y)
- catch
- y=0;
- check=1;
- end
- endfunction
-
- //Defining an inbuilt Objective gradient function
- function [dy,check] = _gradf(x)
- if (options(12) =="on") then
- try
- [y,dy]=fun(x)
- [dy,check] = checkIsreal(dy)
- catch
- dy = 0;
- check=1;
- end
- else
- try
- dy=numderivative(fun,x)
- [dy,check] = checkIsreal(dy)
- catch
- dy=0;
- check=1;
- end
- end
- endfunction
-
- function [y,check] = _addnlc(x)
- x= x(:)
- c = []
- ceq = []
- try
- if((type(nlc) == 13 | type(nlc) == 11) & numNlc~=0) then
- [c,ceq]=nlc(x)
- end
- ylin = [A*x;Aeq*x];
- y = [c(:);ceq(:);ylin(:);];
- [y,check] = checkIsreal(y)
- catch
- y=0;
- check=1;
- end
- endfunction
-
- //Defining an inbuilt jacobian of constraints function
- function [dy,check] = _gradnlc(x)
- if (options(16) =="on") then
- try
- [y1,y2,dy1,dy2]=nlc(x)
- //Adding derivative of Linear Constraint
- dylin = [A;Aeq]
- dy = [dy1;dy2;dylin];
- [dy,check] = checkIsreal(dy)
- catch
- dy = 0;
- check=1;
- end
- else
- try
- dy=numderivative(_addnlc,x)
- [dy,check] = checkIsreal(dy)
- catch
- dy=0;
- check=1;
- end
- end
- endfunction
-
- //Defining a function to calculate Hessian if the respective user entry is OFF
- function [hessy,check]=_gradhess(x,obj_factor,lambda)
- x=x(:);
- if (type(options(14)) == "function") then
- try
- [obj,dy,hessy] = fun(x,obj_factor,lambda)
- [hessy,check] = checkIsreal(hessy)
- catch
- hessy = 0;
- check=1;
- end
- else
- try
- [dy,hessfy]=numderivative(_f,x)
- hessfy = matrix(hessfy,nbVar,nbVar)
- if((type(nlc) == 13 | type(nlc) == 11) & numNlc~=0) then
- [dy,hessny]=numderivative(nlc,x)
- end
- hessianc = []
- for i = 1:numNlc
- hessianc = hessianc + lambda(i)*matrix(hessny(i,:),nbVar,nbVar)
- end
- hessy = obj_factor*hessfy + hessianc;
- [hessy,check] = checkIsreal(hessy)
- catch
- hessy=0;
- check=1;
- end
- end
- endfunction
-
- intconsize = size(intcon,"*")
-
- [xopt,fopt,exitflag] = inter_fmincon(_f,_gradf,_addnlc,_gradnlc,_gradhess,x0,lb,ub,conLb,conUb,intcon,options,nbConInEq+nbConEq);
-
- //In the cases of the problem not being solved, return NULL to the output matrices
- if( exitflag~=0 & exitflag~=3 ) then
- gradient = [];
- hessian = [];
- else
- [ gradient, hessian] = numderivative(_f, xopt)
- end
-
- //To print output message
- select exitflag
-
- case 0 then
- printf("\nOptimal Solution Found.\n");
- case 1 then
- printf("\nInFeasible Solution.\n");
- case 2 then
- printf("\nObjective Function is Continuous Unbounded.\n");
- case 3 then
- printf("\Limit Exceeded.\n");
- case 4 then
- printf("\nUser Interrupt.\n");
- case 5 then
- printf("\nMINLP Error.\n");
- else
- printf("\nInvalid status returned. Notify the Toolbox authors\n");
- break;
- end
-endfunction
-
-function [y, check] = checkIsreal(x)
- if ((~isreal(x))) then
- y = 0
- check=1;
- else
- y = x;
- check=0;
- end
-endfunction