Søren Hauberg wrote:
> man, 24 05 2010 kl. 22:16 +0200, skrev Alois Schlögl:
>> I've committed the changes already in r7326, so others (e.g. Michael) 
>> can see and test against them. The diff is attached.
> 
> These changes look good to me; thanks for doing this.
> 
> A few minor questions:
> 
>> -while niter++ <= maxout && nev(1) < maxev
>> +while niter <= maxout
>> +  niter += 1;
>> +  if nev(1) < maxev, break; end;  
> 
> I don't understand this change. I guess you moved the ++ operation to
> help 'oct2mat' (which is fine by me),

Good, thanks.


but why didn't you just write
> 
>   while (niter <= maxout && nev (1) < maxev)
>     niter ++;


When the condition is false, niter is not incremented anymore. So, niter 
might be off by 1 when the while loop terminates.

niter is checked after the loop has terminated, and the loop can also 
terminate by some break statements. So, there might be a slight chance 
that this difference is relevant.


> 
> ?
> 
>> -  c = 1 + sum ((x-y)(:)'*z*((x-y)(:)));
>> +  c = 1 + sum (vec(x-y)'*z*(vec(x-y)));
> 
> What is the purpose of this (and similar) change?


Its again an issue with oct2mat, which can not deal well with (x-y)(:), 
especially if these are used within more complicated constructs. Using 
vec() avoids this problem.


> 
>> Index: main/optim/inst/minimize.m
>> ===================================================================
>> --- main/optim/inst/minimize.m       (revision 7325)
>> +++ main/optim/inst/minimize.m       (revision 7326)
>> @@ -134,23 +134,7 @@
>>                  "isz",  nan);
>>  
>>  if nargin == 3                      # Accomodation to struct and list 
>> optional
>> -  va_arg_cnt = 1;                           # args
>> -  tmp = nth (varargin, va_arg_cnt++);
>> -
>> -  if isstruct (tmp)
>> -    opls = list ();
>> -    for [v,k] = tmp         # Treat separately unary and binary opts
>> -      if findstr ([" ",k," "],op0)
>> -    opls = append (opls, k);
>> -      else
>> -    opls = append (opls, k, v);
>> -      end
>> -    end
>> -  elseif is_list (tmp)
>> -    opls = tmp;
>> -  else
>> -    opls = list (tmp);
>> -  end
>> +  opls = varargin{1};
> 
> I am most certainly missing the something here, but this change just
> looks odd to me. Can all of the above really be reduced to one line of
> code?

The line of thought was that append, is_list and list are all 
list-specific commands. Since lists are not supported anymore in v3.4, 
this would be obsolete. Now, I see that this was a short-sighted view. 
This part should convert various types of input arguments into cell 
arrays. Thanks for pointing this out.

I found some other issues, that were not properly addressed in the 
list->cell conversion. The changes are summarized in the patch below, I 
committed them already.


Index: line_min.m
===================================================================
--- line_min.m  (revision 7326)
+++ line_min.m  (working copy)
@@ -51,9 +51,12 @@
    a = 0;
                                # was 1e-4
    while (abs (velocity) > 0.000001)
-    fx = feval (f,{args{1:narg-1}, {x+a*dx}, args{narg+1:end}}{:});
-    fxmh = feval (f,{args{1:narg-1}, {x+(a+h)*dx}, args{narg+1:end}}{:});
-    fxmh = feval (f,{args{1:narg-1}, {x+(a-h)*dx}, args{narg+1:end}}{:});
+    arglist = {args{1:narg-1}, x+a*dx, args{narg+1:end}};
+    fx = feval (f,arglist{:});
+    arglist = {args{1:narg-1}, x+(a+h)*dx, args{narg+1:end}};
+    fxph = feval (f,arglist{:});
+    arglist = {args{1:narg-1}, x+(a-h)*dx, args{narg+1:end}};
+    fxmh = feval (f,arglist{:});

      velocity = (fxph - fxmh)/(2*h);
      acceleration = (fxph - 2*fx + fxmh)/(h^2);
Index: fminunc_compat.m
===================================================================
--- fminunc_compat.m    (revision 7326)
+++ fminunc_compat.m    (working copy)
@@ -119,7 +119,7 @@
    if findstr ([" ",k," "], unary_opt)
      opml{end+1} = {k};
    else
-    opml{end+1} = {k,v};
+    opml{end+[1,2]} = {k,v};    # append k and v
    end
  end
                                # Return only options to minimize() ##
Index: minimize.m
===================================================================
--- minimize.m  (revision 7326)
+++ minimize.m  (working copy)
@@ -134,7 +134,22 @@
                    "isz",  nan);

  if nargin == 3                        # Accomodation to struct and list 
optional
-  opls = varargin{1};
+  tmp = varargin{1};
+
+  if isstruct (tmp)
+    opls = {};
+    for [v,k] = tmp            # Treat separately unary and binary opts
+      if findstr ([" ",k," "],op0)
+       opls {end+1} = k;
+      else
+       opls {end+[1:2]} = {k, v};
+      end
+    end
+  elseif iscell (tmp)
+    opls = tmp;
+  else
+    opls = {tmp};
+  end
  else
    opls = varargin;
  end



Alois


------------------------------------------------------------------------------

_______________________________________________
Octave-dev mailing list
Octave-dev@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/octave-dev

Reply via email to