diff options
Diffstat (limited to 'modules/optimization/macros/lmitool.sci')
-rwxr-xr-x | modules/optimization/macros/lmitool.sci | 206 |
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 |