Skip to content

Commit 1eb2eb1

Browse files
committed
Do not internally overwrite database x-values when scaling within bounds
1 parent c068d8d commit 1eb2eb1

File tree

3 files changed

+20
-14
lines changed

3 files changed

+20
-14
lines changed

dfols/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
from __future__ import absolute_import, division, print_function, unicode_literals
4040

4141
# DFO-LS version
42-
__version__ = '1.6.1'
42+
__version__ = '1.6.2'
4343

4444
# Main solver & exit flags
4545
from .solver import *

dfols/controller.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -429,14 +429,14 @@ def initialise_from_database(self, eval_database, number_of_samples, params):
429429
# Add suitable pre-existing evaluations
430430
for i, idx in enumerate(perturbation_idx):
431431
module_logger.info("Adding pre-existing evaluation %g to initial model" % idx)
432-
x, rx = eval_database.get_eval(idx)
432+
x, rx = eval_database.get_eval(idx, scaled_x=True)
433433
self.model.change_point(i + 1, x - self.model.xbase, rx, -idx) # use eval_num = -idx
434434

435435
if new_perturbations is not None:
436436
num_perturbations = new_perturbations.shape[0]
437437
module_logger.debug("Adding %g new evaluations to initial model" % num_perturbations)
438438
for i in range(num_perturbations):
439-
new_point = (eval_database.get_x(base_idx) - self.model.xbase) + new_perturbations[i,:] # new_perturbations[i,:] has length <= self.delta
439+
new_point = (eval_database.get_x(base_idx, scaled_x=True) - self.model.xbase) + new_perturbations[i,:] # new_perturbations[i,:] has length <= self.delta
440440

441441
# Evaluate objective
442442
x = self.model.as_absolute_coordinates(new_point)

dfols/evaluations_database.py

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)