Skip to content

Commit 209731d

Browse files
committed
changed init_conds to search_space because it's a flashier, more memorable, descriptive variable name
1 parent d4769b5 commit 209731d

2 files changed

Lines changed: 19 additions & 19 deletions

File tree

pynumdiff/optimize/_optimize.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from ..kalman_smooth import constant_velocity, constant_acceleration, constant_jerk
1515

1616

17-
# Map from method -> (init_conds, bounds_low_hi)
17+
# Map from method -> (search_space, bounds_low_hi)
1818
method_params_and_bounds = {
1919
spectraldiff: ({'even_extension': True,
2020
'pad_to_zero_dxdt': True,
@@ -87,7 +87,7 @@
8787
method_params_and_bounds[method] = method_params_and_bounds[constant_velocity]
8888

8989

90-
# This function to be at the top level for multiprocessing
90+
# This function has to be at the top level for multiprocessing
9191
def _objective_function(point, func, x, dt, singleton_params, search_space_types, dxdt_truth, metric,
9292
tvgamma, padding):
9393
"""Function minimized by scipy.optimize.minimize, needs to have the form: (point, *args) -> float
@@ -119,14 +119,14 @@ def _objective_function(point, func, x, dt, singleton_params, search_space_types
119119
return rms_rec_x + tvgamma*evaluate.total_variation(dxdt_hat, padding=padding)
120120

121121

122-
def optimize(func, x, dt, init_conds={}, dxdt_truth=None, tvgamma=1e-2, padding='auto', metric='rmse',
122+
def optimize(func, x, dt, search_space={}, dxdt_truth=None, tvgamma=1e-2, padding='auto', metric='rmse',
123123
opt_method='Nelder-Mead', maxiter=10):
124124
"""Find the optimal parameters for a given differentiation method.
125125
126126
:param function func: differentiation method to optimize parameters for, e.g. linear_model.savgoldiff
127127
:param np.array[float]: data to differentiate
128128
:param float dt: step size
129-
:param dict init_conds: function parameter settings to use as initial starting points in optimization,
129+
:param dict search_space: function parameter settings to use as initial starting points in optimization,
130130
structured as :code:`{param1:[values], param2:[values], param3:value, ...}`. The search space
131131
is the Cartesian product. If left None, a default search space of initial values is used.
132132
:param np.array[float] dxdt_truth: actual time series of the derivative of x, if known
@@ -150,7 +150,7 @@ def optimize(func, x, dt, init_conds={}, dxdt_truth=None, tvgamma=1e-2, padding=
150150
raise ValueError('`metric` can only be `error_correlation` if `dxdt_truth` is given.')
151151

152152
params, bounds = method_params_and_bounds[func]
153-
params.update(init_conds) # for things not given, use defaults
153+
params.update(search_space) # for things not given, use defaults
154154

155155
# No need to optimize over singletons, just pass them through
156156
singleton_params = {k:v for k,v in params.items() if not isinstance(v, list)}
@@ -160,7 +160,7 @@ def optimize(func, x, dt, init_conds={}, dxdt_truth=None, tvgamma=1e-2, padding=
160160
if any(v not in [float, int, bool] for v in search_space_types.values()):
161161
raise ValueError("Optimization over categorical strings currently not supported")
162162
# If excluding string type, I can just cast ints and bools to floats, and we're good to go
163-
search_space = product(*[np.array(params[k]).astype(float) for k in search_space_types])
163+
cartesian_product = product(*[np.array(params[k]).astype(float) for k in search_space_types])
164164

165165
bounds = [bounds[k] if k in bounds else # pass these to minimize(). It should respect them.
166166
(0, 1) if v == bool else
@@ -173,7 +173,7 @@ def optimize(func, x, dt, init_conds={}, dxdt_truth=None, tvgamma=1e-2, padding=
173173
_minimize = partial(scipy.optimize.minimize, _obj_fun, method=opt_method, bounds=bounds, options={'maxiter':maxiter})
174174

175175
with Pool(initializer=filterwarnings, initargs=["ignore", '', UserWarning]) as pool: # The heavy lifting
176-
results = pool.map(_minimize, search_space) # returns a bunch of OptimizeResult objects
176+
results = pool.map(_minimize, cartesian_product) # returns a bunch of OptimizeResult objects
177177

178178
opt_idx = np.nanargmin([r.fun for r in results])
179179
opt_point = results[opt_idx].x

pynumdiff/tests/test_optimize.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,32 +24,32 @@ def test_finite_difference():
2424
assert params2['num_iterations'] == 1
2525

2626
def test_mediandiff():
27-
params1, val1 = optimize(mediandiff, x, dt, init_conds={'num_iterations':1}, tvgamma=tvgamma, dxdt_truth=dxdt_truth)
28-
params2, val2 = optimize(mediandiff, x, dt, init_conds={'num_iterations':1}, tvgamma=0, dxdt_truth=None)
27+
params1, val1 = optimize(mediandiff, x, dt, search_space={'num_iterations':1}, tvgamma=tvgamma, dxdt_truth=dxdt_truth)
28+
params2, val2 = optimize(mediandiff, x, dt, search_space={'num_iterations':1}, tvgamma=0, dxdt_truth=None)
2929
assert params1['window_size'] == 5
3030
assert params2['window_size'] == 1
3131

3232
def test_meandiff():
33-
params1, val1 = optimize(meandiff, x, dt, init_conds={'num_iterations':1}, tvgamma=tvgamma, dxdt_truth=dxdt_truth)
34-
params2, val2 = optimize(meandiff, x, dt, init_conds={'num_iterations':1}, tvgamma=0, dxdt_truth=None)
33+
params1, val1 = optimize(meandiff, x, dt, search_space={'num_iterations':1}, tvgamma=tvgamma, dxdt_truth=dxdt_truth)
34+
params2, val2 = optimize(meandiff, x, dt, search_space={'num_iterations':1}, tvgamma=0, dxdt_truth=None)
3535
assert params1['window_size'] == 5
3636
assert params2['window_size'] == 1
3737

3838
def test_gaussiandiff():
39-
params1, val1 = optimize(gaussiandiff, x, dt, init_conds={'num_iterations':1}, tvgamma=tvgamma, dxdt_truth=dxdt_truth)
40-
params2, val2 = optimize(gaussiandiff, x, dt, init_conds={'num_iterations':1}, tvgamma=0, dxdt_truth=None)
39+
params1, val1 = optimize(gaussiandiff, x, dt, search_space={'num_iterations':1}, tvgamma=tvgamma, dxdt_truth=dxdt_truth)
40+
params2, val2 = optimize(gaussiandiff, x, dt, search_space={'num_iterations':1}, tvgamma=0, dxdt_truth=None)
4141
assert params1['window_size'] == 9
4242
assert params2['window_size'] == 1
4343

4444
def test_friedrichsdiff():
45-
params1, val1 = optimize(friedrichsdiff, x, dt, init_conds={'num_iterations':1}, tvgamma=tvgamma, dxdt_truth=dxdt_truth)
46-
params2, val2 = optimize(friedrichsdiff, x, dt, init_conds={'num_iterations':1}, tvgamma=0, dxdt_truth=None)
45+
params1, val1 = optimize(friedrichsdiff, x, dt, search_space={'num_iterations':1}, tvgamma=tvgamma, dxdt_truth=dxdt_truth)
46+
params2, val2 = optimize(friedrichsdiff, x, dt, search_space={'num_iterations':1}, tvgamma=0, dxdt_truth=None)
4747
assert params1['window_size'] == 9
4848
assert params2['window_size'] == 1
4949

5050
def test_butterdiff():
51-
params1, val1 = optimize(butterdiff, x, dt, init_conds={'num_iterations':1}, tvgamma=tvgamma, dxdt_truth=dxdt_truth, maxiter=20)
52-
params2, val2 = optimize(butterdiff, x, dt, init_conds={'num_iterations':1}, tvgamma=0, dxdt_truth=None, maxiter=20)
51+
params1, val1 = optimize(butterdiff, x, dt, search_space={'num_iterations':1}, tvgamma=tvgamma, dxdt_truth=dxdt_truth, maxiter=20)
52+
params2, val2 = optimize(butterdiff, x, dt, search_space={'num_iterations':1}, tvgamma=0, dxdt_truth=None, maxiter=20)
5353

5454
assert params1['filter_order'] == 8 or params1['filter_order'] == 9
5555
np.testing.assert_almost_equal(params1['cutoff_freq'], 0.161, decimal=3)
@@ -66,8 +66,8 @@ def test_splinediff():
6666
np.testing.assert_almost_equal(params2['s'], 0.01, decimal=3)
6767

6868
def test_iterative_velocity():
69-
params1, val1 = optimize(iterative_velocity, x, dt, init_conds={'num_iterations':1}, tvgamma=tvgamma, dxdt_truth=dxdt_truth)
70-
params2, val2 = optimize(iterative_velocity, x, dt, init_conds={'num_iterations':1}, tvgamma=0, dxdt_truth=None)
69+
params1, val1 = optimize(iterative_velocity, x, dt, search_space={'num_iterations':1}, tvgamma=tvgamma, dxdt_truth=dxdt_truth)
70+
params2, val2 = optimize(iterative_velocity, x, dt, search_space={'num_iterations':1}, tvgamma=0, dxdt_truth=None)
7171

7272
np.testing.assert_almost_equal(params1['gamma'], 0.0001, decimal=4)
7373
np.testing.assert_almost_equal(params2['gamma'], 0.0001, decimal=4)

0 commit comments

Comments
 (0)