From unknown Tue Sep 30 18:12:03 2008
X-Loop: owner@bugs.debian.org
Subject: Bug#500521: Acknowledgement (fminimizer nmsimplex unnecessary  size calculation)
Reply-To: Ian Jackson <ijackson@chiark.greenend.org.uk>, 500521@bugs.debian.org
Resent-From: Ian Jackson <ijackson@chiark.greenend.org.uk>
Resent-To: debian-bugs-dist@lists.debian.org
Resent-CC: Dirk Eddelbuettel <edd@debian.org>
Resent-Date: Tue, 30 Sep 2008 00:03:05 +0000
Resent-Message-ID: <handler.500521.B500521.122273280518799@bugs.debian.org>
Resent-Sender: owner@bugs.debian.org
X-Debian-PR-Message: followup 500521
X-Debian-PR-Package: gsl
X-Debian-PR-Keywords: patch
Received: via spool by 500521-submit@bugs.debian.org id=B500521.122273280518799
          (code B ref 500521); Tue, 30 Sep 2008 00:03:05 +0000
Received: (at 500521) by bugs.debian.org; 30 Sep 2008 00:00:05 +0000
X-Spam-Checker-Version: SpamAssassin 3.2.3-bugs.debian.org_2005_01_02
	(2007-08-08) on rietz.debian.org
X-Spam-Level: 
X-Spam-Bayes: score:0.0000 Tokens: new, 99; hammy, 98; neutral, 39; spammy, 1.
	spammytokens:0.929-+--H*r:sk:rietz.d hammytokens:0.000-+--H*UA:Emacs,
	0.000-+--H*r:3.36, 0.000-+--const, 0.000-+--H*f:sk:handler,
	0.000-+--H*MI:sk:handler
X-Spam-Status: No, score=-8.5 required=4.0 tests=AWL,BAYES_00,HAS_BUG_NUMBER,
	MURPHY_DRUGS_REL8 autolearn=ham version=3.2.3-bugs.debian.org_2005_01_02
Received: from chiark.greenend.org.uk ([212.13.197.229])
	by rietz.debian.org with esmtp (Exim 4.63)
	(envelope-from <ijackson@chiark.greenend.org.uk>)
	id 1KkSer-0004rR-7U
	for 500521@bugs.debian.org; Tue, 30 Sep 2008 00:00:05 +0000
Received: by chiark.greenend.org.uk (Debian Exim 3.36 #1) with local
	(return-path ijackson@chiark.greenend.org.uk)
	id 1KkSeo-0004pt-00
	for 500521@bugs.debian.org; Tue, 30 Sep 2008 01:00:02 +0100
From: Ian Jackson <ijackson@chiark.greenend.org.uk>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Message-ID: <18657.27650.960323.481969@chiark.greenend.org.uk>
Date: Tue, 30 Sep 2008 01:00:02 +0100
To: 500521@bugs.debian.org
In-Reply-To: <handler.500521.B.122265132328925.ack@bugs.debian.org>
References: <18656.11703.396810.4793@davenant.relativity.greenend.org.uk>
	<handler.500521.B.122265132328925.ack@bugs.debian.org>
X-Mailer: VM 7.03 under Emacs 19.34.1

I forgot to attach the patch.

diff -u orig/gsl-1.8/multimin/fminimizer.c gsl-1.8/multimin/fminimizer.c
--- orig/gsl-1.8/multimin/fminimizer.c	2005-06-26 14:25:35.000000000 +0100
+++ gsl-1.8/multimin/fminimizer.c	2008-09-29 02:07:29.000000000 +0100
@@ -90,7 +90,9 @@
 
   gsl_vector_memcpy (s->x,x);
 
-  return (s->type->set) (s->state, s->f, s->x, &(s->size), step_size);
+  s->simplex_size_valid = 0;
+
+  return (s->type->set) (s->state, s->f, s->x, step_size);
 }
 
 void
@@ -105,7 +107,9 @@
 int
 gsl_multimin_fminimizer_iterate (gsl_multimin_fminimizer * s)
 {
-  return (s->type->iterate) (s->state, s->f, s->x, &(s->size), &(s->fval));
+  s->simplex_size_valid = 0;
+
+  return (s->type->iterate) (s->state, s->f, s->x, &(s->fval));
 }
 
 const char * 
@@ -128,7 +132,12 @@
 }
 
 double
-gsl_multimin_fminimizer_size (const gsl_multimin_fminimizer * s)
+gsl_multimin_fminimizer_size (gsl_multimin_fminimizer * s)
 {
-  return s->size;
+  if (!s->simplex_size_valid)
+    {
+      s->simplex_size = (s->type->get_size) (s->state);
+      s->simplex_size_valid = 1;
+    }
+  return s->simplex_size;
 }
Only in gsl-1.8/multimin: fminimizer.c~
diff -u orig/gsl-1.8/multimin/gsl_multimin.h gsl-1.8/multimin/gsl_multimin.h
--- orig/gsl-1.8/multimin/gsl_multimin.h	2005-06-26 14:25:35.000000000 +0100
+++ gsl-1.8/multimin/gsl_multimin.h	2008-09-29 02:08:17.000000000 +0100
@@ -84,13 +84,12 @@
   int (*alloc) (void *state, size_t n);
   int (*set) (void *state, gsl_multimin_function * f,
               const gsl_vector * x, 
-              double * size,
               const gsl_vector * step_size);
   int (*iterate) (void *state, gsl_multimin_function * f, 
                   gsl_vector * x, 
-                  double * size,
                   double * fval);
   void (*free) (void *state);
+  double (*get_size) (void *state);
 }
 gsl_multimin_fminimizer_type;
 
@@ -103,7 +102,8 @@
   double fval;
   gsl_vector * x;
   
-  double size;
+  int simplex_size_valid;
+  double simplex_size;
 
   void *state;
 }
@@ -135,7 +135,7 @@
 gsl_multimin_fminimizer_minimum (const gsl_multimin_fminimizer * s);
 
 double
-gsl_multimin_fminimizer_size (const gsl_multimin_fminimizer * s);
+gsl_multimin_fminimizer_size (gsl_multimin_fminimizer * s);
 
 /* Convergence test functions */
 
Only in gsl-1.8/multimin: gsl_multimin.h~
diff -u orig/gsl-1.8/multimin/simplex.c gsl-1.8/multimin/simplex.c
--- orig/gsl-1.8/multimin/simplex.c	2005-06-26 14:25:35.000000000 +0100
+++ gsl-1.8/multimin/simplex.c	2008-09-29 02:01:18.000000000 +0100
@@ -150,8 +150,10 @@
 }
 
 static double
-nmsimplex_size (nmsimplex_state_t * state)
+nmsimplex_get_size (void *vstate)
 {
+  nmsimplex_state_t *state = (nmsimplex_state_t *) vstate;
+
   /* calculates simplex size as average sum of length of vectors 
      from simplex center to corner points:     
 
@@ -218,7 +220,7 @@
 static int
 nmsimplex_set (void *vstate, gsl_multimin_function * f,
                const gsl_vector * x,
-               double *size, const gsl_vector * step_size)
+               const gsl_vector * step_size)
 {
   int status;
   size_t i;
@@ -252,10 +254,6 @@
       gsl_vector_set (state->y1, i + 1, val);
     }
 
-  /* Initialize simplex size */
-
-  *size = nmsimplex_size (state);
-
   return GSL_SUCCESS;
 }
 
@@ -272,7 +270,7 @@
 
 static int
 nmsimplex_iterate (void *vstate, gsl_multimin_function * f,
-                   gsl_vector * x, double *size, double *fval)
+                   gsl_vector * x, double *fval)
 {
 
   /* Simplex iteration tries to minimize function f value */
@@ -395,10 +393,6 @@
   gsl_matrix_get_row (x, x1, lo);
   *fval = gsl_vector_get (y1, lo);
 
-  /* Update simplex size */
-
-  *size = nmsimplex_size (state);
-
   return GSL_SUCCESS;
 }
 
@@ -408,7 +402,8 @@
   &nmsimplex_alloc,
   &nmsimplex_set,
   &nmsimplex_iterate,
-  &nmsimplex_free
+  &nmsimplex_free,
+  &nmsimplex_get_size
 };
 
 const gsl_multimin_fminimizer_type
Only in gsl-1.8/multimin: simplex.c~




