summaryrefslogtreecommitdiff
path: root/modules/optimization/macros/lmitool.sci
diff options
context:
space:
mode:
Diffstat (limited to 'modules/optimization/macros/lmitool.sci')
-rwxr-xr-xmodules/optimization/macros/lmitool.sci206
1 files changed, 206 insertions, 0 deletions
diff --git a/modules/optimization/macros/lmitool.sci b/modules/optimization/macros/lmitool.sci
new file mode 100755
index 000000000..09dfea957
--- /dev/null
+++ b/modules/optimization/macros/lmitool.sci
@@ -0,0 +1,206 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) INRIA
+//
+// 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.1-en.txt
+//
+function [txtdo]=lmitool(PROBNAME,XNAME,DNAME)
+ [LHS,RHS]=argn(0);
+ txtdo=[]
+
+ if or(RHS == [0 2]) then
+ error(msprintf(_("%s: Wrong number of input arguments: %d or %d expected.\n"),"lmitool",1,3))
+ end
+
+ if RHS == 1 then
+ messagebox([gettext("Welcome to LMITOOL");" ";" ";
+ gettext("LMITOOL is a Scilab package for LMI optimization");
+ " ";
+ " ";
+ gettext("It can solve the following problem");
+ " ";
+ gettext(" minimize f(X1,...,XM) ");
+ gettext("subject to the LME constraints: ");
+ gettext(" Gi(X1,...,XM)=0, i=1,2,...,p,");
+ gettext("and the LMI constraints: ");
+ gettext(" Hj(X1,...,XM)>=0, j=1,2,...,q.");
+ " ";
+ gettext("where");
+ gettext("X1,...,XM are unknown real matrices, referred to as the unknown matrices,");
+ gettext("f is the objective function, a linear scalar function of the entries of the X''s,");
+ gettext("Gi''s are affine matrix functions of the entries of the X''s,");
+ gettext("Hj''s are affine symmetric matrix functions of the entries of the X''s.");
+ " ";
+ gettext("These functions are parameterized by the entries of known data matrices D1,...,DN.");
+ " ";
+ gettext("For a detailed description and examples consult: ");
+ gettext(" ''LMITOOL: a Package for LMI Optimization in Scilab, User''s Guide'' ");
+ " ";
+ gettext("LMITOOL uses Semidefinite Programming package SP developed by L. Vandenberghe and S. Boyd.")],"modal","scilab");
+
+ tt=read(PROBNAME,-1,1,"(a)");
+ tt=stripblanks(tt);
+ mat=str2vec(tt);
+ [q1,p1]=find(mat'=="[");
+ [q2,p2]=find(mat'=="]");
+ XNAME1=mat(p1(1),q1(1)+1:q2(1)-1);
+ XNAME1=strcat(XNAME1);
+ [q1,p1]=find(mat'=="(");
+ [q2,p2]=find(mat'==")");
+ DNAME1=mat(p1(1),q1(1)+1:q2(1)-1);
+ DNAME1=strcat(DNAME1);
+ [q2,p2]=find(mat'=="=");
+ PROBNAME1=mat(p2(1),q2(1)+1:q1(1)-1);
+ PROBNAME1=strcat(PROBNAME1);
+
+ labels=[gettext("LMI problem name: ");gettext("Names of unknown matrices: "); ...
+ gettext("Names of data matrices: ")];
+ [ok,PROBNAME,XNAME,DNAME]=getvalue([gettext("Problem definition");
+ gettext("LMITOOL will generate a skeleton of the functions needed");
+ gettext(" (see User''s Guide for details). For that, you need to specify:");
+ gettext("1- Name of your problem which will be given to the solver function,");
+ gettext("2- Names of unknown matrices or list of unknown matrices,");
+ gettext("3- Names of data matrices or list of data matrices.")], labels', ...
+ list("str",1,"str",1,"str",1), ...
+ [PROBNAME1, XNAME1, DNAME1]);
+ if ok==%f then
+ txtdo=gettext("Try again");
+ return;
+ end
+ end
+
+ PROBNAME=stripblanks(PROBNAME);
+ XNAME=stripblanks(XNAME);
+ DNAME=stripblanks(DNAME);
+
+ pathname=pwd();
+
+ fname = pathname+filesep()+PROBNAME+".sci";
+
+ txt0="function ["+XNAME+"]="+PROBNAME+"("+DNAME+")"
+ txt0=[txt0;"/"+"/ Generated by lmitool on ";" "];
+
+ txt0=[txt0;
+ " Mbound = 1e3;";
+ " abstol = 1e-10;";
+ " nu = 10;";
+ " maxiters = 100;";
+ " reltol = 1e-10;";
+ " options=[Mbound,abstol,nu,maxiters,reltol];"
+ " "]
+
+ nv=length(XNAME);
+ index_commas=[];
+ for k=1:nv
+ if part(XNAME,k)=="," then index_commas=[index_commas,k],end
+ end
+ vnum = length(index_commas)+1;
+ index_commas = [0 index_commas length(XNAME)+1];
+
+ txt1=[];txt2=[];
+ for i = 1:vnum,
+ vname = part(XNAME,index_commas(i)+1:index_commas(i+1)-1);
+ if RHS<>1 then
+ txt1 = [txt1;
+ vname+"_init=..."]
+ end
+ txt2=[txt2,vname+"_init"];
+ end
+
+ txts1=["function [LME,LMI,OBJ]="+PROBNAME+"_eval(XLIST)";
+ "["+XNAME+"]=XLIST(:)"]
+ if RHS ~= 1 then
+ txts2=["LME=...";"LMI=...";"OBJ=..."]
+ else
+ [p,q]=size(mat);
+ ind=[]
+ for i=1:p
+ if mat(i,2:7)==["/","/","/","/","/","/"] then
+ ind=[ind i];
+ end
+ end
+ if size(ind,"*")<>4 then
+ error(gettext("File not generated by lmitool or badly modified."));
+ end
+ txt1=[];
+ for i=ind(1)+1:ind(2)-1
+ txt1=[txt1;strcat(mat(i,:))];
+ end
+ txts2=[];
+ for i=ind(4)+1:p
+ txts2=[txts2;strcat(mat(i,:))];
+ end
+ end
+
+ sep11="///////////DEFINE INITIAL GUESS AND PRELIMINARY CALCULATIONS BELOW"
+ sep12="/////////// "
+ sep13="/////////////////DEFINE LME, LMI and OBJ BELOW"
+ sep2="/////////////////EVALUATION FUNCTION////////////////////////////"
+
+ txt2=[
+ "XLIST0=list("+strcat(txt2,",")+")";
+ "XLIST=lmisolver(XLIST0,"+PROBNAME+"_eval,options)";
+ "["+XNAME+"]=XLIST(:)"];
+
+ txt4=[txt0;sep11;txt1;sep12;" ";txt2;" ";" ";" ";...
+ sep2;" ";txts1;" ";sep13;txts2];
+
+ if RHS==0|RHS==1 then
+ [txt4]=x_dialog([gettext("Function definitions: ");
+ gettext("Here is a skeleton of the functions you should edit.");
+ gettext("You can edit in this window or click on ''ok''.");
+ gettext("Save and edit the skeleton later through your favorite editor.")],[txt4]);
+ end
+ if txt4==[] then txtdo="Try again";return;end
+ txt=[txt4];
+ n=1;
+ if RHS<>3 then
+
+ fname=x_dialog([gettext("Name of the file where to save the solver function");
+ gettext("and the evaluation function");
+ gettext("(Will overwrite if a file with the same name already exists).")],[fname+" "])
+ fname=stripblanks(fname);
+ else
+ messagebox(gettext("functions saved in ")+fname',"modal","info");
+ end
+ if fname<>[] then
+ deletefile(fname)
+ write(fname,txt)
+ else
+ return
+ end
+
+ // Tell the user what to do:
+ if RHS==0|RHS==1 then
+ txtdo = [" To solve your problem, you need to ";
+ "1- load your functions using the command:";
+ " exec(''"+fname'+"'')";
+ "2- Define "+DNAME+" and call function "+PROBNAME+" as follows:";
+ " "+"["+XNAME+"]="+PROBNAME+"("+DNAME+")";
+ " Good luck! ";
+ "To check the result, use [LME,LMI,OBJ]="+PROBNAME+"_eval(list("+XNAME+"))"]
+
+ messagebox(txtdo,"modal","info");return
+ end
+ if RHS==3 then
+ txtdo = [gettext(" To solve your problem, you need to ");
+ gettext("1- edit file ")+fname
+ gettext("2- load (and compile) your functions:");
+ " exec(''"+fname'+"'')";
+ gettext("3- Define ")+DNAME+gettext(" and call ")+PROBNAME+gettext(" function:");
+ " "+"["+XNAME+"]="+PROBNAME+"("+DNAME+")";
+ gettext("To check the result, use [LME,LMI,OBJ]=")+PROBNAME+"_eval(list("+XNAME+"))"]
+ end
+
+endfunction
+function [vec]=str2vec(str)
+ w=length(str);
+ [p,q]=size(w);ma=max(w);
+ vec=[];
+ for i=1:ma
+ vec=[vec part(str,i)]
+ end
+endfunction