Optimization help: document optional parameters. 80/13080/6
Paul BIGNIER [Tue, 5 Nov 2013 09:37:59 +0000 (10:37 +0100)]
Unit test and exemple corrected.
optim gateway corrected about the output argument "ti".

Input parameters "si" and "sd" were available but not documented.

Change-Id: Id4f93e78f6b7efa466e21517272dc5f2f5af32ec

scilab/modules/optimization/help/en_US/optim.xml
scilab/modules/optimization/sci_gateway/fortran/sci_f_optim.f
scilab/modules/optimization/tests/unit_tests/optim_sourcefortran2.dia.ref
scilab/modules/optimization/tests/unit_tests/optim_sourcefortran2.tst

index 1290657..37c8a9c 100644 (file)
@@ -28,6 +28,7 @@
             [fopt, xopt, gopt, work, iters] = optim(...)
             [fopt, xopt, gopt, work, iters, evals] = optim(...)
             [fopt, xopt, gopt, work, iters, evals, err] = optim(...)
+            [fopt, xopt, [gopt, work, iters, evals, err], ti, td] = optim(..., params="si","sd")
         </synopsis>
     </refsynopsisdiv>
     <refsection>
                             </para>
                             <para>This mode combines the two previous modes.</para>
                         </listitem>
+                        <listitem>
+                            <para>
+                                <literal>"si"</literal>
+                            </para>
+                            <para>
+                                In this mode, <literal>valti</literal> is saved in the output
+                                variable <varname>ti</varname>.
+                            </para>
+                        </listitem>
+                        <listitem>
+                            <para>
+                                <literal>"sd"</literal>
+                            </para>
+                            <para>
+                                In this mode, <literal>valtd</literal> is saved in the output
+                                variable <varname>td</varname>.
+                            </para>
+                        </listitem>
+                        <listitem>
+                            <para>
+                                <literal>"si","sd"</literal>
+                            </para>
+                            <para>This mode combines the two previous modes.</para>
+                        </listitem>
                     </itemizedlist>
                     <para>
                         The <literal>ti, td</literal> arrays may be used so that the
             '      if(ind.eq.10) then'
             '         nizs=2'
             '         nrzs=1'
-            '         ndzs=2'
+            '         ndzs=1'
             '         return'
             '      endif'
             '      if(ind.eq.11) then'
             '         izs(1)=5'
             '         izs(2)=10'
-            '         dzs(2)=100.0d+0'
+            '         dzs(1)=100.0d+0'
             '         return'
             '      endif'
             '      if(ind.eq.2)go to 5'
             '5     f=1.0d+0'
             '      do 10 i=2,n'
             '        im1=i-1'
-            '10      f=f + dzs(2)*(x(i)-x(im1)**2)**2 + (1.0d+0-x(i))**2'
+            '10      f=f + dzs(1)*(x(i)-x(im1)**2)**2 + (1.0d+0-x(i))**2'
             '      if(ind.eq.2)return'
-            '20    g(1)=-4.0d+0*dzs(2)*(x(2)-x(1)**2)*x(1)'
+            '20    g(1)=-4.0d+0*dzs(1)*(x(2)-x(1)**2)*x(1)'
             '      nm1=n-1'
             '      do 30 i=2,nm1'
             '        im1=i-1'
             '        ip1=i+1'
-            '        g(i)=2.0d+0*dzs(2)*(x(i)-x(im1)**2)'
-            '30      g(i)=g(i) -4.0d+0*dzs(2)*(x(ip1)-x(i)**2)*x(i) - '
+            '        g(i)=2.0d+0*dzs(1)*(x(i)-x(im1)**2)'
+            '30      g(i)=g(i) -4.0d+0*dzs(1)*(x(ip1)-x(i)**2)*x(i) - '
             '     &amp;        2.0d+0*(1.0d+0-x(i))'
-            '      g(n)=2.0d+0*dzs(2)*(x(n)-x(nm1)**2) - 2.0d+0*(1.0d+0-x(n))'
+            '      g(n)=2.0d+0*dzs(1)*(x(n)-x(nm1)**2) - 2.0d+0*(1.0d+0-x(n))'
             '      return'
             '      end'];
             cd TMPDIR;
             [etc...]
         </programlisting>
     </refsection>
+    <refsection>
+        <title>Example: Fortran function with tab saving
+        </title>
+        <para>
+            Adding the "si" and/or "sd" options to <literal>optim</literal> implies
+            the addition of the output arguments "ti" and/or "td", which will represent
+            the working tables of the objective function.
+        </para>
+        <para>
+            Those output arguments must be placed at the end of the output list.
+        </para>
+        <programlisting role="example">
+            // Move into the temporary directory to create the temporary files there
+            cur_dir = pwd();
+            chdir(TMPDIR);
+            fortransource = ['      subroutine rosenf(ind,n,x,f,g,izs,rzs,dzs)'
+            'C     -------------------------------------------'
+            'c (DLL Digital Visual Fortran)'
+            'c On Windows , we need to import common nird from scilab'
+            'cDEC$ IF DEFINED (FORDLL)'
+            'cDEC$ ATTRIBUTES DLLIMPORT:: /nird/'
+            'cDEC$ ENDIF'
+            'C     -------------------------------------------'
+            'c     Example of cost function given by a subroutine'
+            'c     if n.le.2 returns ind=0'
+            'c     f.bonnans, oct 86'
+            '      implicit double precision (a-h,o-z)'
+            '      real rzs(1)'
+            '      double precision dzs(*)'
+            '      dimension x(n),g(n),izs(*)'
+            '      common/nird/nizs,nrzs,ndzs'
+            '      if (n.lt.3) then'
+            '        ind=0'
+            '        return'
+            '      endif'
+            '      if(ind.eq.10) then'
+            '         nizs=2'
+            '         nrzs=1'
+            '         ndzs=1'
+            '         return'
+            '      endif'
+            '      if(ind.eq.11) then'
+            '         izs(1)=5'
+            '         izs(2)=10'
+            '         dzs(1)=100.0d+0'
+            '         return'
+            '      endif'
+            '      if(ind.eq.2)go to 5'
+            '      if(ind.eq.3)go to 20'
+            '      if(ind.eq.4)go to 5'
+            '      ind=-1'
+            '      return'
+            '5     f=1.0d+0'
+            '      do 10 i=2,n'
+            '        im1=i-1'
+            '10      f=f + dzs(1)*(x(i)-x(im1)**2)**2 + (1.0d+0-x(i))**2'
+            '      if(ind.eq.2)return'
+            '20    g(1)=-4.0d+0*dzs(1)*(x(2)-x(1)**2)*x(1)'
+            '      nm1=n-1'
+            '      do 30 i=2,nm1'
+            '        im1=i-1'
+            '        ip1=i+1'
+            '        g(i)=2.0d+0*dzs(1)*(x(i)-x(im1)**2)'
+            '30      g(i)=g(i) -4.0d+0*dzs(1)*(x(ip1)-x(i)**2)*x(i) - '
+            '     &amp;        2.0d+0*(1.0d+0-x(i))'
+            '      g(n)=2.0d+0*dzs(1)*(x(n)-x(nm1)**2) - 2.0d+0*(1.0d+0-x(n))'
+            '      return'
+            '      end'];
+            mputl(fortransource, TMPDIR + '/rosenf.f');
+            ilib_for_link('rosenf', 'rosenf.f', [], 'f');
+            exec loader.sce;
+            chdir(cur_dir);
+            //
+            // Define some constants
+            //
+            Leps = 10e3 * 8.e-5;
+            bs = 10.*ones(1, 5);
+            bi = -bs;
+            x0 = 0.12 * bs;
+            epsx = 1.e-15 * x0;
+            xopt = .1*bs;
+            
+            // 'ti' and 'td' always at the end of the output sequence
+            [f, x, ti, td]                           = optim('rosenf', x0, 'in', 'si', 'sd')
+            [f, x, g, ti, td]                        = optim('rosenf', x0, 'in', 'si', 'sd')
+            [f, x, g, w, ti, td]                     = optim('rosenf', x0, 'in', 'si', 'sd')
+            [f, x, g, w, niter, nevals, ti, td]      = optim('rosenf', x0, 'in', 'si', 'sd')
+            [f, x, g, w, niter, nevals, err, ti, td] = optim('rosenf', x0, 'in', 'si', 'sd')
+            
+            // With input argument 'in', ti and td will be initialized by rosenf function.
+            [f, x, ti, td] = optim('rosenf', x0, 'in', 'si', 'sd')
+            // Reuses the last ti and td for the next call and return it again.
+            [f, x, ti, td] = optim('rosenf', x0, 'ti', ti, 'td', td, 'si', 'sd')
+            
+            // Initializes ti and td but return only ti
+            [f, x, ti] = optim('rosenf', x0, 'in', 'si')
+            [f, x, ti] = optim('rosenf', x0, 'ti', ti, 'si')
+            
+            // Initializes ti and td but return only td
+            [f, x, td] = optim('rosenf', x0, 'in', 'sd')
+            [f, x, td] = optim('rosenf', x0, 'td', td, 'sd')
+        </programlisting>
+    </refsection>
     <refsection role="see also">
         <title>See Also</title>
         <simplelist type="inline">
index ef9e4f4..a5c8e82 100644 (file)
@@ -1,17 +1,17 @@
 c Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 c Copyright (C) INRIA
-c 
+c
 c This file must be used under the terms of the CeCILL.
 c This source file is licensed as described in the file COPYING, which
 c you should have received as part of this distribution.  The terms
-c are also available at    
+c are also available at
 c http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
 c
 c     --------------------------
 c     SCILAB function : optim
 c     --------------------------
       subroutine scioptim(fname)
-      
+
       character*(*) fname
        INCLUDE 'stack.h'
       double precision tol,df0,zng,dxmin
@@ -23,21 +23,21 @@ c     --------------------------
       common /nird/ nizs,nrzs,ndzs
       external foptim,boptim,fuclid,ctonb,ctcab
       integer coin,coar,coti,cotd,cosi,cosd,nfac
-c     
+c
       character*(nlgh+1) namef,namej
       common/csolve/namef,namej
 c
       integer impn(nsiz)
       logical eqid, getscalar
       integer iadr, sadr
-c     
+c
       parameter (nsiz1=nsiz-1)
       data impn/672732690,nsiz1*673720360/
 c
       data coin,coar,coti,cotd,cosi,cosd,nfac
      &     /   5906,6922,4637,3357,4636,3356, 0/
-c     
-      
+c
+
       iadr(l)=l+l-1
       sadr(l)=(l/2)+1
 
@@ -76,7 +76,7 @@ c
       lrzs=ldisp
       ldzs=ldisp
       ldisp=ldzs+1
-c     
+c
       top2=top+1-rhs
       top3=top2
       topin=top2-1
@@ -85,8 +85,8 @@ c
          call error(39)
          return
       endif
-c     
-c     
+c
+c
 c     traitement de simul
       l1=istk(il)
       if((l1-10)*(l1-11)*(l1-13)*(l1-15).ne.0) then
@@ -96,7 +96,7 @@ c     traitement de simul
       endif
 c
 c Compute isim :
-c - isim=1 if the cost function is given as a string (code 10), that is, the cost function is 
+c - isim=1 if the cost function is given as a string (code 10), that is, the cost function is
 c   a C or Fortran routine.
 c   In that case, the cost function is computed with a call to "foptim".
 c - isim=2 if the cost function is given as a script (code 11), a compiled script (code 13),
@@ -116,7 +116,7 @@ c     cas simul=liste
          if(err.gt.0) return
          nomsub(nc+1:nc+1)=char(0)
          call setfoptim(nomsub,irep)
-         if ( irep.eq.1) then 
+         if ( irep.eq.1) then
             buf = nomsub
             call error(50)
             return
@@ -130,7 +130,7 @@ c     cas simul=macro
       endif
       top2=top2+1
       il=iadr(lstk(top2))
-c     
+c
 c Compute icontr
 c - icontr=1 if without constraints
 c - icontr=2 if with bound constraints
@@ -180,7 +180,7 @@ c     contraintes de borne :chaine "b" (code 11), xinf , xsup
          top2=top2+1
          il=iadr(lstk(top2))
       end if
-c     
+c
 c     point initial
       if(istk(il).gt.2.or.istk(il).eq.0)  then
          err=top2-topin
@@ -207,7 +207,7 @@ c     a quoi servent les 2 lignes suivantes. elle pose pb pour le nom de la macr
 c     simulateur dans les messages d'erreur
 c     idstk(1,top-1)=nx1
 c     idstk(2,top-1)=nx2
-c     
+c
 c     stockage de g
       lg=ldisp
       ldisp=lg + nx
@@ -219,7 +219,7 @@ c     stockage de g
       if (top2.eq.top) go to 200
       top2=top2+1
       il=iadr(lstk(top2))
-c     
+c
 c     choix d algorithme
 c
 c Compute ialg1
@@ -246,7 +246,7 @@ c
             il=iadr(lstk(top2))
          end if
       endif
-c     
+c
 c     df0
       if(istk(il).eq.1.and.istk(il+1)*istk(il+2).eq.1) then
          df0=stk(sadr(il+4))
@@ -258,7 +258,7 @@ c     df0
          top2=top2 + 1
          il=iadr(lstk(top2))
       endif
-c     
+c
 c     mmx
       if(istk(il).eq.1.and.istk(il+1)*istk(il+2).eq.1) then
          l=sadr(il+4)
@@ -268,7 +268,7 @@ c     mmx
          top2=top2+1
          il=iadr(lstk(top2))
       end if
-c     
+c
 c     hot start (optimiseurs n1qn1 et qnbd)
       if(istk(il).eq.1.and.istk(il+3).eq.0) then
          if (ialg.ne.1) then
@@ -287,7 +287,7 @@ c     hot start (optimiseurs n1qn1 et qnbd)
          top2=top2+1
          il=iadr(lstk(top2))
       end if
-c     
+c
 c     chaine 'ar'
       if(istk(il).ne.10)  then
          err=top2-topin
@@ -308,7 +308,7 @@ c     chaine 'ar'
       if (top2.eq.top) go to 200
       top2=top2+1
       il=iadr(lstk(top2))
-c     
+c
 c     napm et itmax
       if(istk(il).eq.1.and.istk(il+1)*istk(il+2).eq.1) then
          l=sadr(il+4)
@@ -324,7 +324,7 @@ c     napm et itmax
          top2=top2+1
          il=iadr(lstk(top2))
       end if
-c     
+c
 c     epsg,epsf,epsx (note : epsx est un vecteur)
       if(istk(il).eq.1.and.istk(il+1)*istk(il+2).eq.1) then
          epsg=stk(sadr(il+4))
@@ -349,7 +349,7 @@ c     epsg,epsf,epsx (note : epsx est un vecteur)
          top2=top2+1
          il=iadr(lstk(top2))
       endif
-c     
+c
 c     chaine 'in'
 c
  150  if(istk(il).ne.10) then
@@ -385,7 +385,7 @@ c     on initialise nizs,nrzs,ndzs
      &           izs,rzs,dzs)
          endif
          if(err.gt.0.or.err1.gt.0) return
-c     
+c
          if(indsim.le.0) then
             indopt=-7
             if(indsim.eq.0) indopt=0
@@ -416,7 +416,7 @@ c     stockage de izs,rzs,dzs dans la pile
          top2=top2 + 1
          il=iadr(lstk(top2))
       endif
-c     
+c
 c     izs et dzs en entree (chaine 'ti' et/ou 'td' suivie du tableau)
       if(istk(il).ne.10) then
          err=top2-topin
@@ -476,7 +476,7 @@ c     izs et dzs en entree (chaine 'ti' et/ou 'td' suivie du tableau)
             il=iadr(lstk(top2))
          endif
       endif
-c     
+c
 c     mettre ti = izs et/ou td = dzs en sortie (chaine 'si' ou 'sd')
       if(istk(il).ne.10) then
          err=top2-topin
@@ -499,7 +499,7 @@ c     mettre ti = izs et/ou td = dzs en sortie (chaine 'si' ou 'sd')
          top2=top2+1
          il=iadr(lstk(top2))
       endif
-c     
+c
       if(istk(il).ne.10) then
          err=top2-topin
          call error(55)
@@ -521,13 +521,13 @@ c
          return
       endif
       irecd=1
-c     
+c
 c     fin epluchage liste appel
  200  if (top.ne.top2) then
          call error(39)
          return
       endif
-c     
+c
 c     creation des variables contenant le simulateur et ind
       top=top+1
       topind=top
@@ -539,7 +539,7 @@ c     creation des variables contenant le simulateur et ind
       istk(il+3)=0
       ldisp=sadr(il+4)
       ldisp=ldisp+1
-c     
+c
       top=top+1
       lstk(top)=ldisp
       il=iadr(ldisp)
@@ -549,11 +549,11 @@ c
       istk(il+3)=topx
       istk(il+4)=topind
       ldisp=sadr(il+5)
-c     
+c
 c     initialisation eventuelle de f et g
       iarret=0
       if (napm.lt.2.or.itmax.lt.1) iarret=1
-c     
+c
       if((icontr.eq.1.and.(ialg.eq.2.or.ialg.eq.10)).or.
      &     (icontr.eq.2.and.ialg.eq.1.and.indtv.eq.1) .or.
      &     (iarret.eq.1)    )   then
@@ -574,9 +574,9 @@ c
          endif
          if (napm.lt.2.or.itmax.lt.1) go to 300
       endif
-c     
+c
 c     appel de l optimiseur
-c     
+c
 c     optimiseur n1qn1 : Quasi-Newton without constraints
       if(icontr.eq.1.and.ialg.eq.1) then
          lvar=ldisp
@@ -598,12 +598,12 @@ c     optimiseur n1qn1 : Quasi-Newton without constraints
  50      continue
          nitv=0
          lstk(top + 1)=ldisp
-c     
+c
 c     mise en memoire de parametres d entree pour l affectation de indop
          itmax1=itmax
          napm1=napm
          epsg1=epsg
-c     
+c
          if(isim.eq.1) then
             call n1qn1(foptim,nx,stk(lx),stk(lf),stk(lg),
      &           stk(lvar),epsg,mode,itmax,napm,imp,io,stk(ltv),
@@ -653,7 +653,7 @@ c     tableaux de travail (mmx=nombre de mises a jour)
             return
          endif
          lstk(top+1)=ldisp
-c     
+c
          if(isim.eq.1) then
             indsim=4
             call foptim(indsim,nx,stk(lx),stk(lf),stk(lg),
@@ -682,7 +682,7 @@ c
          if (mode.eq.7) indopt=7
          go to 300
       endif
-c     
+c
 c     optimiseur n1fc1 : non smooth without constraints
       if(icontr.eq.1.and.ialg.eq.10) then
          if (immx.eq.0) mmx=10
@@ -728,7 +728,7 @@ c     interpretation de la cause de retour
          if (mode.eq.6)indopt=3
          go to 300
       endif
-c     
+c
 c     optimiseur qnbd : quasi-newton with bound constraints
       if(icontr.eq.2.and.ialg.eq.1) then
          if (iepsx.eq.1) then
@@ -785,7 +785,7 @@ c     optimiseur qnbd : quasi-newton with bound constraints
          if(err.gt.0.or.err1.gt.0) return
          go to 300
       endif
-c     
+c
 c     optimiseur gcbd : Gradient Conjugate with bound constraints
       if(icontr.eq.2.and.ialg.eq.2) then
          nt=2
@@ -826,22 +826,22 @@ c     optimiseur gcbd : Gradient Conjugate with bound constraints
          if(err.gt.0.or.err1.gt.0) return
          go to 300
       endif
-c     
+c
 c     algorithme non implante
       call error(136)
       return
-c     
+c
 c     laissons la pile aussi propre qu on aurait aime la trouver
  300  top2=top3
       top =top3 + lhs - 1
       fun=0
-c     
+c
       lhs1=lhs - ireci -irecd
       if (lhs1.le.0) then
          call error(41)
          return
       endif
-c     
+c
 c     sauvegarde de f
       il=iadr(lstk(top2))
       istk(il)=1
@@ -852,7 +852,7 @@ c     sauvegarde de f
       stk(l)=stk(lf)
       lstk(top+1)=l+1
       if(lhs.eq.1) go to 320
-c     
+c
 c     sauvegarde de x
       l=l+1
       top2=top2 + 1
@@ -869,7 +869,7 @@ c     sauvegarde de x
       lstk(top+1)=lx1+nx
       call unsfdcopy(nx,stk(lx) ,1,stk(lx1),1)
       if(lhs1.eq.2) go to 320
-c     
+c
 c     sauvegarde de g
       top2=top2 + 1
       lstk(top2)=lstk(top+1)
@@ -884,7 +884,7 @@ c     sauvegarde de g
       call unsfdcopy(nx,stk(lg) ,1,stk(l),1)
       lstk(top+1)=l+nx
       if(lhs1.eq.3) goto 320
-c     
+c
 c     sauvegarde de tv (tableau interne a l' optimiseur - pour hot start
       if (lhs1.ge.4) then
          istv=0
@@ -936,7 +936,7 @@ c     if (l+ntv+nitv+1.ge.sadr(lizs)) then
       endif
       lstk(top+1)=l + ntv + nitv
       if(lhs1.eq.4) goto 320
-c     
+c
 c     sauvegarde de niter
       top2=top2 + 1
       lstk(top2)=lstk(top+1)
@@ -949,7 +949,7 @@ c     sauvegarde de niter
       stk(l)=itmax
       lstk(top+1)=l+1
       if(lhs1.eq.5) go to 320
-c     
+c
 c     sauvegarde de napm
       top2=top2 + 1
       lstk(top2)=lstk(top+1)
@@ -962,7 +962,7 @@ c     sauvegarde de napm
       stk(l)=napm
       lstk(top+1)=l+1
       if(lhs1.eq.6) go to 320
-c     
+c
 c     sauvegarde de indopt
       top2=top2 + 1
       lstk(top2)=lstk(top+1)
@@ -974,7 +974,7 @@ c     sauvegarde de indopt
       l=sadr(il+4)
       stk(l)=indopt
       lstk(top+1)=l+1
-c     
+c
 c     sauvegarde de izs et dzs
  320  if (lhs.eq.lhs1) go to 350
       if (ireci.eq.1) then
@@ -986,7 +986,9 @@ c     sauvegarde de izs et dzs
          istk(il+2)=nizs
          istk(il+3)=0
          l=sadr(il+4)
-         do 325 i=0,nizs-1
+c        izs can be transformed in place. (int to double)
+c        Inverse the loop prevents the overwrite of the second int.
+         do 325 i=(nizs-1), 0, -1
             stk(l+i)=real(istk(lizs+i))
  325     continue
          lstk(top+1)=l+nizs
@@ -1004,7 +1006,7 @@ c     sauvegarde de izs et dzs
          lstk(top+1)=l+ndzs
       endif
       go to 350
-c     
+c
 c     commentaires finaux
  350  continue
       if (iarret.eq.1) return
index 960184f..af9d878 100644 (file)
@@ -21,61 +21,61 @@ ilib_verbose(0);
 // Move into the temporary directory to create the temporary files there
 cur_dir = pwd();
 chdir(TMPDIR);
-fortransource=['      subroutine rosenf(ind,n,x,f,g,izs,rzs,dzs)'
-'C     -------------------------------------------'
-'c (DLL Digital Visual Fortran)'     
-'c On Windows , we need to import common nird from scilab'
-'cDEC$ IF DEFINED (FORDLL)'
-'cDEC$ ATTRIBUTES DLLIMPORT:: /nird/'
-'cDEC$ ENDIF'
-'C     -------------------------------------------'
-'c     Example of cost function given by a subroutine'
-'c     if n<=2 returns ind=0'
-'c     f.bonnans, oct 86'
-'      implicit double precision (a-h,o-z)'
-'      real rzs(1)'
-'      double precision dzs(*)'
-'      dimension x(n),g(n),izs(*)'
-'      common/nird/nizs,nrzs,ndzs'
-'      if (n.lt.3) then'
-'        ind=0'
-'        return'
-'      endif'
-'      if(ind.eq.10) then'
-'         nizs=2'
-'         nrzs=1'
-'         ndzs=2'
-'         return'
-'      endif'
-'      if(ind.eq.11) then'
-'         izs(1)=5'
-'         izs(2)=10'
-'         dzs(2)=100.0d+0'
-'         return'
-'      endif'
-'      if(ind.eq.2)go to 5'
-'      if(ind.eq.3)go to 20'
-'      if(ind.eq.4)go to 5'
-'      ind=-1'
-'      return'
-'5     f=1.0d+0'
-'      do 10 i=2,n'
-'        im1=i-1'
-'10      f=f + dzs(2)*(x(i)-x(im1)**2)**2 + (1.0d+0-x(i))**2'
-'      if(ind.eq.2)return'
-'20    g(1)=-4.0d+0*dzs(2)*(x(2)-x(1)**2)*x(1)'
-'      nm1=n-1'
-'      do 30 i=2,nm1'
-'        im1=i-1'
-'        ip1=i+1'
-'        g(i)=2.0d+0*dzs(2)*(x(i)-x(im1)**2)'
-'30      g(i)=g(i) -4.0d+0*dzs(2)*(x(ip1)-x(i)**2)*x(i) - '
-'     &        2.0d+0*(1.0d+0-x(i))'
-'      g(n)=2.0d+0*dzs(2)*(x(n)-x(nm1)**2) - 2.0d+0*(1.0d+0-x(n))'
-'      return'
-'      end'];
-mputl(fortransource, TMPDIR + '/rosenf.f');
-ilib_for_link('rosenf', 'rosenf.f', [], 'f');
+fortransource=["      subroutine rosenf(ind,n,x,f,g,izs,rzs,dzs)"
+"C     -------------------------------------------"
+"c (DLL Digital Visual Fortran)"
+"c On Windows , we need to import common nird from scilab"
+"cDEC$ IF DEFINED (FORDLL)"
+"cDEC$ ATTRIBUTES DLLIMPORT:: /nird/"
+"cDEC$ ENDIF"
+"C     -------------------------------------------"
+"c     Example of cost function given by a subroutine"
+"c     if n<=2 returns ind=0"
+"c     f.bonnans, oct 86"
+"      implicit double precision (a-h,o-z)"
+"      real rzs(1)"
+"      double precision dzs(*)"
+"      dimension x(n),g(n),izs(*)"
+"      common/nird/nizs,nrzs,ndzs"
+"      if (n.lt.3) then"
+"        ind=0"
+"        return"
+"      endif"
+"      if(ind.eq.10) then"
+"         nizs=2"
+"         nrzs=1"
+"         ndzs=1"
+"         return"
+"      endif"
+"      if(ind.eq.11) then"
+"         izs(1)=5"
+"         izs(2)=10"
+"         dzs(1)=100.0d+0"
+"         return"
+"      endif"
+"      if(ind.eq.2)go to 5"
+"      if(ind.eq.3)go to 20"
+"      if(ind.eq.4)go to 5"
+"      ind=-1"
+"      return"
+"5     f=1.0d+0"
+"      do 10 i=2,n"
+"        im1=i-1"
+"10      f=f + dzs(1)*(x(i)-x(im1)**2)**2 + (1.0d+0-x(i))**2"
+"      if(ind.eq.2)return"
+"20    g(1)=-4.0d+0*dzs(1)*(x(2)-x(1)**2)*x(1)"
+"      nm1=n-1"
+"      do 30 i=2,nm1"
+"        im1=i-1"
+"        ip1=i+1"
+"        g(i)=2.0d+0*dzs(1)*(x(i)-x(im1)**2)"
+"30      g(i)=g(i) -4.0d+0*dzs(1)*(x(ip1)-x(i)**2)*x(i) - "
+"     &        2.0d+0*(1.0d+0-x(i))"
+"      g(n)=2.0d+0*dzs(1)*(x(n)-x(nm1)**2) - 2.0d+0*(1.0d+0-x(n))"
+"      return"
+"      end"];
+mputl(fortransource, TMPDIR + "/rosenf.f");
+ilib_for_link("rosenf", "rosenf.f", [], "f");
 exec loader.sce;
 chdir(cur_dir);
 //
@@ -90,71 +90,78 @@ xopt = .1*bs;
 //
 // Solve the problem
 //
-[f, x, g] = optim('rosenf', x0, 'in');
+[f, x, g] = optim("rosenf", x0, "in");
 if abs(f - 1 + norm(x - xopt) ) > Leps then bugmes();quit;end
-[f, x, g] = optim('rosenf', x0, 'gc', 'in');
+[f, x, g] = optim("rosenf", x0, "gc", "in");
 if abs(f - 1 + norm(x - xopt) ) > Leps then bugmes();quit;end
 //
-[f, x, g] = optim('rosenf', x0, 'nd', 'in');
+[f, x, g] = optim("rosenf", x0, "nd", "in");
 if abs(f - 1 + norm(x - xopt) ) > Leps then bugmes();quit;end
-[f, x, g] = optim('rosenf', x0, 'qn', 1, 'in');
+[f, x, g] = optim("rosenf", x0, "qn", 1, "in");
 if abs(f - 1 + norm(x - xopt) ) > Leps then bugmes();quit;end
-[f, x, g] = optim('rosenf', x0, 'gc', 1, 50, 'in');
+[f, x, g] = optim("rosenf", x0, "gc", 1, 50, "in");
 if abs(f - 1 + norm(x - xopt) ) > Leps then bugmes();quit;end
 //
-[f, x ,g] = optim('rosenf', x0, 'nd', 1,50, 'in');
+[f, x ,g] = optim("rosenf", x0, "nd", 1,50, "in");
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
-[f, x1, g] =optim('rosenf', x0,  'ar', 100, 6, 'in');
-[f, x, g, to] = optim('rosenf', x0,  'ar', 100, 3, 'in');
-[f, x, g, to] = optim('rosenf', x , to, 'ar', 100, 3, 'in');
+[f, x1, g] =optim("rosenf", x0,  "ar", 100, 6, "in");
+[f, x, g, to] = optim("rosenf", x0,  "ar", 100, 3, "in");
+[f, x, g, to] = optim("rosenf", x , to, "ar", 100, 3, "in");
 if norm(x-x1)/norm(x-xopt) > 0.1 then  bugmes();quit;end
-[f, x1, g] = optim('rosenf', 'b', bi, bs, x0, 'ar', 100, 6, 'in');
-[f, x, g, to] = optim('rosenf', 'b', bi, bs, x0, 'ar', 100, 3, 'in');
-[f, x, g]   =optim('rosenf', 'b', bi, bs, x, to, 'ar', 100, 3, 'in');
+[f, x1, g] = optim("rosenf", "b", bi, bs, x0, "ar", 100, 6, "in");
+[f, x, g, to] = optim("rosenf", "b", bi, bs, x0, "ar", 100, 3, "in");
+[f, x, g]   =optim("rosenf", "b", bi, bs, x, to, "ar", 100, 3, "in");
 if norm(x-x1)/norm(x-xopt) > 0.1 then  bugmes();quit;end
 //
 // Test all possible stop criteria settings
 //
-[f, x, g] = optim('rosenf', x0, 'ar', 'in');
+[f, x, g] = optim("rosenf", x0, "ar", "in");
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
-[f, x, g] = optim('rosenf', x0, 'ar', 100, 'in');
+[f, x, g] = optim("rosenf", x0, "ar", 100, "in");
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
-[f, x, g] = optim('rosenf', x0, 'ar', 100, 100, 'in');
+[f, x, g] = optim("rosenf", x0, "ar", 100, 100, "in");
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
-[f, x, g] = optim('rosenf', x0, 'ar', 100, 100, %eps, 'in');
+[f, x, g] = optim("rosenf", x0, "ar", 100, 100, %eps, "in");
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
-[f, x, g] = optim('rosenf', x0, 'ar', 100, 100, %eps, %eps, 'in');
+[f, x, g] = optim("rosenf", x0, "ar", 100, 100, %eps, %eps, "in");
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
-[f, x, g] = optim('rosenf', x0, 'ar', 100, 100, 10.*%eps, %eps, epsx, 'in');
+[f, x, g] = optim("rosenf", x0, "ar", 100, 100, 10.*%eps, %eps, epsx, "in");
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
-[f, x, g] = optim('rosenf', x0, 'gc', 'ar', 100, 100, %eps, %eps, epsx, 'in');
+[f, x, g] = optim("rosenf", x0, "gc", "ar", 100, 100, %eps, %eps, epsx, "in");
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
 //
-[f, x, g] = optim('rosenf', 'b', bi, bs, x0, 'in');
+[f, x, g] = optim("rosenf", "b", bi, bs, x0, "in");
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
-[f, x, g] = optim('rosenf', 'b', bi, bs, x0, 'gc', 'in');
+[f, x, g] = optim("rosenf", "b", bi, bs, x0, "gc", "in");
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
-[f, x] = optim('rosenf', 'b', bi, bs, x0, 'ar', 100, 100, 1.d-8, 'in');
+[f, x] = optim("rosenf", "b", bi, bs, x0, "ar", 100, 100, 1.d-8, "in");
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
-[f, x, g] = optim('rosenf', ..
-'b', bi, bs, x0, 'gc', 'ar', 100, 100, %eps, %eps, epsx, 'in');
+[f, x, g] = optim("rosenf", ..
+"b", bi, bs, x0, "gc", "ar", 100, 100, %eps, %eps, epsx, "in");
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
-[f, x, g, to, td] = optim('rosenf', x0, 'in', 'sd');
+[f, x, g, to, td] = optim("rosenf", x0, "in", "sd");
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
-[f, x, g, ti] = optim('rosenf', x0, 'gc', 'in', 'si');
+[f, x, g, ti] = optim("rosenf", x0, "gc", "in", "si");
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
-[f, x, g, to, ti, td] = optim('rosenf', x0, to, 'in', 'si', 'sd');
+[f, x, g, to, ti, td] = optim("rosenf", x0, to, "in", "si", "sd");
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
-[f, x, g, td] = optim('rosenf', ..
-'b', bi, bs, x0, 'gc', 'ar', 100, 100, %eps, %eps, epsx, 'in', 'sd');
+[f, x, g, td] = optim("rosenf", ..
+"b", bi, bs, x0, "gc", "ar", 100, 100, %eps, %eps, epsx, "in", "sd");
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
-[f, x, g, ti] = optim('rosenf', x0, 'gc', 'ar', 100, 100, %eps, 'in', 'si');
+[f, x, g, ti] = optim("rosenf", x0, "gc", "ar", 100, 100, %eps, "in", "si");
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
-[f, x, g, ti, td] = optim('rosenf', ..
-x0, 'gc', 'ar', 100, 100, %eps, 'in', 'si', 'sd');
+[f, x, g, ti, td] = optim("rosenf", ..
+x0, "gc", "ar", 100, 100, %eps, "in", "si", "sd");
 if abs(f-1+norm(x-xopt) ) > Leps then bugmes();quit;end
-[f,  x,  g,  ti,  td] = optim('rosenf', ..
-x0, 'gc', 'ar', 100, 100, %eps, 'in', 'ti', ti, 'td', td, 'si', 'sd');
+[f,  x,  g,  ti,  td] = optim("rosenf", ..
+x0, "gc", "ar", 100, 100, %eps, "in", "ti", ti, "td", td, "si", "sd");
 if abs(f - 1 + norm(x - xopt) ) > Leps then bugmes();quit;end
+//
+// init ti and td
+[f, x, g, ti, td] = optim("rosenf", x0, "in", "si", "sd");
+// reuses it
+[f, x, g, ti2, td2] = optim("rosenf", x0, "ti", ti, "td", td, "si", "sd");
+assert_checkequal(ti, ti2);
+assert_checkequal(td, td2);
 // Clean-up
 ulink();
index f4cb006..80685cd 100644 (file)
@@ -25,61 +25,61 @@ ilib_verbose(0);
 // Move into the temporary directory to create the temporary files there
 cur_dir = pwd();
 chdir(TMPDIR);
-fortransource=['      subroutine rosenf(ind,n,x,f,g,izs,rzs,dzs)'
-'C     -------------------------------------------'
-'c (DLL Digital Visual Fortran)'     
-'c On Windows , we need to import common nird from scilab'
-'cDEC$ IF DEFINED (FORDLL)'
-'cDEC$ ATTRIBUTES DLLIMPORT:: /nird/'
-'cDEC$ ENDIF'
-'C     -------------------------------------------'
-'c     Example of cost function given by a subroutine'
-'c     if n<=2 returns ind=0'
-'c     f.bonnans, oct 86'
-'      implicit double precision (a-h,o-z)'
-'      real rzs(1)'
-'      double precision dzs(*)'
-'      dimension x(n),g(n),izs(*)'
-'      common/nird/nizs,nrzs,ndzs'
-'      if (n.lt.3) then'
-'        ind=0'
-'        return'
-'      endif'
-'      if(ind.eq.10) then'
-'         nizs=2'
-'         nrzs=1'
-'         ndzs=2'
-'         return'
-'      endif'
-'      if(ind.eq.11) then'
-'         izs(1)=5'
-'         izs(2)=10'
-'         dzs(2)=100.0d+0'
-'         return'
-'      endif'
-'      if(ind.eq.2)go to 5'
-'      if(ind.eq.3)go to 20'
-'      if(ind.eq.4)go to 5'
-'      ind=-1'
-'      return'
-'5     f=1.0d+0'
-'      do 10 i=2,n'
-'        im1=i-1'
-'10      f=f + dzs(2)*(x(i)-x(im1)**2)**2 + (1.0d+0-x(i))**2'
-'      if(ind.eq.2)return'
-'20    g(1)=-4.0d+0*dzs(2)*(x(2)-x(1)**2)*x(1)'
-'      nm1=n-1'
-'      do 30 i=2,nm1'
-'        im1=i-1'
-'        ip1=i+1'
-'        g(i)=2.0d+0*dzs(2)*(x(i)-x(im1)**2)'
-'30      g(i)=g(i) -4.0d+0*dzs(2)*(x(ip1)-x(i)**2)*x(i) - '
-'     &        2.0d+0*(1.0d+0-x(i))'
-'      g(n)=2.0d+0*dzs(2)*(x(n)-x(nm1)**2) - 2.0d+0*(1.0d+0-x(n))'
-'      return'
-'      end'];
-mputl(fortransource, TMPDIR + '/rosenf.f');
-ilib_for_link('rosenf', 'rosenf.f', [], 'f');
+fortransource=["      subroutine rosenf(ind,n,x,f,g,izs,rzs,dzs)"
+"C     -------------------------------------------"
+"c (DLL Digital Visual Fortran)"
+"c On Windows , we need to import common nird from scilab"
+"cDEC$ IF DEFINED (FORDLL)"
+"cDEC$ ATTRIBUTES DLLIMPORT:: /nird/"
+"cDEC$ ENDIF"
+"C     -------------------------------------------"
+"c     Example of cost function given by a subroutine"
+"c     if n<=2 returns ind=0"
+"c     f.bonnans, oct 86"
+"      implicit double precision (a-h,o-z)"
+"      real rzs(1)"
+"      double precision dzs(*)"
+"      dimension x(n),g(n),izs(*)"
+"      common/nird/nizs,nrzs,ndzs"
+"      if (n.lt.3) then"
+"        ind=0"
+"        return"
+"      endif"
+"      if(ind.eq.10) then"
+"         nizs=2"
+"         nrzs=1"
+"         ndzs=1"
+"         return"
+"      endif"
+"      if(ind.eq.11) then"
+"         izs(1)=5"
+"         izs(2)=10"
+"         dzs(1)=100.0d+0"
+"         return"
+"      endif"
+"      if(ind.eq.2)go to 5"
+"      if(ind.eq.3)go to 20"
+"      if(ind.eq.4)go to 5"
+"      ind=-1"
+"      return"
+"5     f=1.0d+0"
+"      do 10 i=2,n"
+"        im1=i-1"
+"10      f=f + dzs(1)*(x(i)-x(im1)**2)**2 + (1.0d+0-x(i))**2"
+"      if(ind.eq.2)return"
+"20    g(1)=-4.0d+0*dzs(1)*(x(2)-x(1)**2)*x(1)"
+"      nm1=n-1"
+"      do 30 i=2,nm1"
+"        im1=i-1"
+"        ip1=i+1"
+"        g(i)=2.0d+0*dzs(1)*(x(i)-x(im1)**2)"
+"30      g(i)=g(i) -4.0d+0*dzs(1)*(x(ip1)-x(i)**2)*x(i) - "
+"     &        2.0d+0*(1.0d+0-x(i))"
+"      g(n)=2.0d+0*dzs(1)*(x(n)-x(nm1)**2) - 2.0d+0*(1.0d+0-x(n))"
+"      return"
+"      end"];
+mputl(fortransource, TMPDIR + "/rosenf.f");
+ilib_for_link("rosenf", "rosenf.f", [], "f");
 exec loader.sce;
 chdir(cur_dir);
 //
@@ -94,74 +94,81 @@ xopt = .1*bs;
 //
 // Solve the problem
 //
-[f, x, g] = optim('rosenf', x0, 'in');
+[f, x, g] = optim("rosenf", x0, "in");
 if abs(f - 1 + norm(x - xopt) ) > Leps then pause,end
-[f, x, g] = optim('rosenf', x0, 'gc', 'in');
+[f, x, g] = optim("rosenf", x0, "gc", "in");
 if abs(f - 1 + norm(x - xopt) ) > Leps then pause, end
 //
-[f, x, g] = optim('rosenf', x0, 'nd', 'in');
+[f, x, g] = optim("rosenf", x0, "nd", "in");
 if abs(f - 1 + norm(x - xopt) ) > Leps then pause, end
 
-[f, x, g] = optim('rosenf', x0, 'qn', 1, 'in');
+[f, x, g] = optim("rosenf", x0, "qn", 1, "in");
 if abs(f - 1 + norm(x - xopt) ) > Leps then pause,end
-[f, x, g] = optim('rosenf', x0, 'gc', 1, 50, 'in');
+[f, x, g] = optim("rosenf", x0, "gc", 1, 50, "in");
 if abs(f - 1 + norm(x - xopt) ) > Leps then pause,end
 //
-[f, x ,g] = optim('rosenf', x0, 'nd', 1,50, 'in');
+[f, x ,g] = optim("rosenf", x0, "nd", 1,50, "in");
 if abs(f-1+norm(x-xopt) ) > Leps then pause,end
 
-[f, x1, g] =optim('rosenf', x0,  'ar', 100, 6, 'in');
-[f, x, g, to] = optim('rosenf', x0,  'ar', 100, 3, 'in');
-[f, x, g, to] = optim('rosenf', x , to, 'ar', 100, 3, 'in');
+[f, x1, g] =optim("rosenf", x0,  "ar", 100, 6, "in");
+[f, x, g, to] = optim("rosenf", x0,  "ar", 100, 3, "in");
+[f, x, g, to] = optim("rosenf", x , to, "ar", 100, 3, "in");
 if norm(x-x1)/norm(x-xopt) > 0.1 then  pause, end
-[f, x1, g] = optim('rosenf', 'b', bi, bs, x0, 'ar', 100, 6, 'in');
-[f, x, g, to] = optim('rosenf', 'b', bi, bs, x0, 'ar', 100, 3, 'in');
-[f, x, g]   =optim('rosenf', 'b', bi, bs, x, to, 'ar', 100, 3, 'in');
+[f, x1, g] = optim("rosenf", "b", bi, bs, x0, "ar", 100, 6, "in");
+[f, x, g, to] = optim("rosenf", "b", bi, bs, x0, "ar", 100, 3, "in");
+[f, x, g]   =optim("rosenf", "b", bi, bs, x, to, "ar", 100, 3, "in");
 if norm(x-x1)/norm(x-xopt) > 0.1 then  pause, end
 //
 // Test all possible stop criteria settings
 //
-[f, x, g] = optim('rosenf', x0, 'ar', 'in');
+[f, x, g] = optim("rosenf", x0, "ar", "in");
 if abs(f-1+norm(x-xopt) ) > Leps then pause, end
-[f, x, g] = optim('rosenf', x0, 'ar', 100, 'in');
+[f, x, g] = optim("rosenf", x0, "ar", 100, "in");
 if abs(f-1+norm(x-xopt) ) > Leps then pause, end
-[f, x, g] = optim('rosenf', x0, 'ar', 100, 100, 'in');
+[f, x, g] = optim("rosenf", x0, "ar", 100, 100, "in");
 if abs(f-1+norm(x-xopt) ) > Leps then pause, end
-[f, x, g] = optim('rosenf', x0, 'ar', 100, 100, %eps, 'in');
+[f, x, g] = optim("rosenf", x0, "ar", 100, 100, %eps, "in");
 if abs(f-1+norm(x-xopt) ) > Leps then pause, end
-[f, x, g] = optim('rosenf', x0, 'ar', 100, 100, %eps, %eps, 'in');
+[f, x, g] = optim("rosenf", x0, "ar", 100, 100, %eps, %eps, "in");
 if abs(f-1+norm(x-xopt) ) > Leps then pause, end
-[f, x, g] = optim('rosenf', x0, 'ar', 100, 100, 10.*%eps, %eps, epsx, 'in');
+[f, x, g] = optim("rosenf", x0, "ar", 100, 100, 10.*%eps, %eps, epsx, "in");
 if abs(f-1+norm(x-xopt) ) > Leps then pause, end
-[f, x, g] = optim('rosenf', x0, 'gc', 'ar', 100, 100, %eps, %eps, epsx, 'in');
+[f, x, g] = optim("rosenf", x0, "gc", "ar", 100, 100, %eps, %eps, epsx, "in");
 if abs(f-1+norm(x-xopt) ) > Leps then pause, end
 //
-[f, x, g] = optim('rosenf', 'b', bi, bs, x0, 'in');
+[f, x, g] = optim("rosenf", "b", bi, bs, x0, "in");
 if abs(f-1+norm(x-xopt) ) > Leps then pause, end
-[f, x, g] = optim('rosenf', 'b', bi, bs, x0, 'gc', 'in');
+[f, x, g] = optim("rosenf", "b", bi, bs, x0, "gc", "in");
 if abs(f-1+norm(x-xopt) ) > Leps then pause, end
-[f, x] = optim('rosenf', 'b', bi, bs, x0, 'ar', 100, 100, 1.d-8, 'in');
+[f, x] = optim("rosenf", "b", bi, bs, x0, "ar", 100, 100, 1.d-8, "in");
 if abs(f-1+norm(x-xopt) ) > Leps then pause, end
-[f, x, g] = optim('rosenf', ..
-'b', bi, bs, x0, 'gc', 'ar', 100, 100, %eps, %eps, epsx, 'in');
+[f, x, g] = optim("rosenf", ..
+"b", bi, bs, x0, "gc", "ar", 100, 100, %eps, %eps, epsx, "in");
 if abs(f-1+norm(x-xopt) ) > Leps then pause, end
-[f, x, g, to, td] = optim('rosenf', x0, 'in', 'sd');
+[f, x, g, to, td] = optim("rosenf", x0, "in", "sd");
 if abs(f-1+norm(x-xopt) ) > Leps then pause, end
-[f, x, g, ti] = optim('rosenf', x0, 'gc', 'in', 'si');
+[f, x, g, ti] = optim("rosenf", x0, "gc", "in", "si");
 if abs(f-1+norm(x-xopt) ) > Leps then pause, end
-[f, x, g, to, ti, td] = optim('rosenf', x0, to, 'in', 'si', 'sd');
+[f, x, g, to, ti, td] = optim("rosenf", x0, to, "in", "si", "sd");
 if abs(f-1+norm(x-xopt) ) > Leps then pause, end
-[f, x, g, td] = optim('rosenf', ..
-'b', bi, bs, x0, 'gc', 'ar', 100, 100, %eps, %eps, epsx, 'in', 'sd');
+[f, x, g, td] = optim("rosenf", ..
+"b", bi, bs, x0, "gc", "ar", 100, 100, %eps, %eps, epsx, "in", "sd");
 if abs(f-1+norm(x-xopt) ) > Leps then pause, end
-[f, x, g, ti] = optim('rosenf', x0, 'gc', 'ar', 100, 100, %eps, 'in', 'si');
+[f, x, g, ti] = optim("rosenf", x0, "gc", "ar", 100, 100, %eps, "in", "si");
 if abs(f-1+norm(x-xopt) ) > Leps then pause, end
-[f, x, g, ti, td] = optim('rosenf', ..
-x0, 'gc', 'ar', 100, 100, %eps, 'in', 'si', 'sd');
+[f, x, g, ti, td] = optim("rosenf", ..
+x0, "gc", "ar", 100, 100, %eps, "in", "si", "sd");
 if abs(f-1+norm(x-xopt) ) > Leps then pause, end
-[f,  x,  g,  ti,  td] = optim('rosenf', ..
-x0, 'gc', 'ar', 100, 100, %eps, 'in', 'ti', ti, 'td', td, 'si', 'sd');
+[f,  x,  g,  ti,  td] = optim("rosenf", ..
+x0, "gc", "ar", 100, 100, %eps, "in", "ti", ti, "td", td, "si", "sd");
 if abs(f - 1 + norm(x - xopt) ) > Leps then pause, end
+//
+// init ti and td
+[f, x, g, ti, td] = optim("rosenf", x0, "in", "si", "sd");
+// reuses it
+[f, x, g, ti2, td2] = optim("rosenf", x0, "ti", ti, "td", td, "si", "sd");
+assert_checkequal(ti, ti2);
+assert_checkequal(td, td2);
 // Clean-up
 ulink();