@@ -27,6 +27,9 @@ def __init__(self, eval_list=None, starting_eval=None):
2727 if starting_eval is not None and 0 <= starting_eval <= len (self ._evals ):
2828 self .starting_eval = starting_eval
2929
30+ # Scaling changes
31+ self .scaling_changes = None
32+
3033 def __len__ (self ):
3134 return len (self ._evals )
3235
@@ -50,25 +53,28 @@ def get_starting_eval_idx(self):
5053
5154 return self .starting_eval
5255
53- def get_eval (self , index ):
56+ def get_eval (self , index , scaled_x = False ):
5457 # Return (x, rx) for given index
5558 if 0 <= index < len (self ):
56- return self ._evals [index ][0 ], self ._evals [index ][1 ]
59+ x = self ._evals [index ][0 ]
60+ rx = self ._evals [index ][1 ]
61+ if scaled_x and self .scaling_changes is not None :
62+ return apply_scaling (x , self .scaling_changes ), rx
63+ else :
64+ return x , rx
5765 else :
5866 raise IndexError ("Invalid index %g given current set of %g evaluations" % (index , len (self )))
5967
60- def get_x (self , index ):
61- return self .get_eval (index )[0 ]
68+ def get_x (self , index , scaled_x = False ):
69+ return self .get_eval (index , scaled_x = scaled_x )[0 ]
6270
6371 def get_rx (self , index ):
6472 return self .get_eval (index )[1 ]
6573
6674 def apply_scaling (self , scaling_changes ):
67- # Adjust all input x values based on scaling
68- if scaling_changes is not None :
69- for i in range (len (self )):
70- x , rx = self ._evals [i ]
71- self ._evals [i ] = (apply_scaling (x , scaling_changes ), rx )
75+ # Save scaling information for on-the-fly use
76+ # (don't change self._evals internally as prevents the database being re-used)
77+ self .scaling_changes = scaling_changes
7278 return
7379
7480 def select_starting_evals (self , delta , xl = None , xu = None , projections = [], tol = 1e-8 ,
@@ -85,7 +91,7 @@ def select_starting_evals(self, delta, xl=None, xu=None, projections=[], tol=1e-
8591 raise RuntimeError ("Need at least one evaluation to select starting evaluations" )
8692
8793 base_idx = self .get_starting_eval_idx ()
88- xbase = self .get_x (self .get_starting_eval_idx ())
94+ xbase = self .get_x (self .get_starting_eval_idx (), scaled_x = True )
8995 n = len (xbase )
9096 module_logger .debug ("Selecting starting evaluations from existing database" )
9197 module_logger .debug ("Have %g evaluations to choose from" % len (self ))
@@ -100,7 +106,7 @@ def select_starting_evals(self, delta, xl=None, xu=None, projections=[], tol=1e-
100106 for i in range (n_perturbations + 1 ):
101107 if i == base_idx :
102108 continue
103- Lfull [row_idx , :] = (self .get_x (i ) - xbase ) / delta # Lfull[i,:] = (xi-xbase) / delta
109+ Lfull [row_idx , :] = (self .get_x (i , scaled_x = True ) - xbase ) / delta # Lfull[i,:] = (xi-xbase) / delta
104110 row_idx += 1
105111
106112 xdist = np .linalg .norm (Lfull , axis = 1 ) # xdist[i] = ||Lfull[i,:]|| = ||xi-xbase|| / delta
0 commit comments