Skip to content

Commit 0ce0922

Browse files
committed
moved TVR to new optimizer
1 parent 18d4bc1 commit 0ce0922

4 files changed

Lines changed: 52 additions & 224 deletions

File tree

pynumdiff/optimize/_optimize.py

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
from ..finite_difference import first_order
1111
from ..smooth_finite_difference import mediandiff, meandiff, gaussiandiff, friedrichsdiff, butterdiff, splinediff
1212
from ..linear_model import spectraldiff, polydiff, savgoldiff, lineardiff
13+
from ..total_variation_regularization import velocity, acceleration, jerk, iterative_velocity, smooth_acceleration, jerk_sliding
14+
from ..kalman_smooth import constant_velocity, constant_acceleration, constant_jerk
1315

1416

1517
# Map from method -> (init_conds, bounds_low_hi)
@@ -59,9 +61,27 @@
5961
{'order': (3, 5),
6062
's': (1e-2, 1e6),
6163
'num_iterations': (1, 10)}),
64+
velocity: ({'gamma': [1e-2, 1e-1, 1, 10, 100, 1000]},
65+
{'gamma': (1e-4, 1e7)}),
66+
iterative_velocity: ({'num_iterations': [1, 5, 10],
67+
'gamma': [1e-2, 1e-1, 1, 10, 100, 1000],
68+
'scale': 'small'},
69+
{'num_iterations': (1, 100), # gets expensive with more iterations
70+
'gamma': (1e-4, 1e7)})
71+
smooth_acceleration: ({'gamma': [1e-2, 1e-1, 1, 10, 100, 1000],
72+
'window_size': [3, 10, 30, 50, 90, 130]},
73+
{'gamma': (1e-4, 1e7),
74+
'window_size': (1, 1000)})
75+
# jerk_sliding:
76+
# constant_velocity:
77+
# constant_acceleration:
78+
# constant_jerk:
6279
}
6380
for method in [meandiff, gaussiandiff, friedrichsdiff]:
6481
method_params_and_bounds[method] = method_params_and_bounds[mediandiff]
82+
for method in [acceleration, jerk]:
83+
method_params_and_bounds[method] = method_params_and_bounds[velocity]
84+
method_params_and_bounds[jerk_sliding] = method_params_and_bounds[smooth_acceleration]
6585

6686

6787
# This function to be at the top level for multiprocessing
@@ -97,7 +117,7 @@ def _objective_function(point, func, x, dt, singleton_params, search_space_types
97117

98118

99119
def optimize(func, x, dt, init_conds={}, dxdt_truth=None, tvgamma=1e-2, padding='auto', metric='rmse',
100-
opt_method='Nelder-Mead', opt_kwargs={'maxiter': 10}):
120+
opt_method='Nelder-Mead', maxiter=10):
101121
"""Find the optimal parameters for a given differentiation method.
102122
103123
:param function func: differentiation method to optimize parameters for, e.g. linear_model.savgoldiff
@@ -115,7 +135,7 @@ def optimize(func, x, dt, init_conds={}, dxdt_truth=None, tvgamma=1e-2, padding=
115135
:param str metric: either :code:`'rmse'` or :code:`'error_correlation'`, only applies if :code:`dxdt_truth`
116136
is not None, see _objective_function
117137
:param str opt_method: Optimization technique used by :code:`scipy.minimize`, the workhorse
118-
:param dict opt_kwargs: keyword arguments to pass down to :code:`scipy.minimize`
138+
:param int maxiter: passed down to :code:`scipy.minimize`, maximum iterations
119139
120140
:return: tuple[dict, float] of\n
121141
- **opt_params** -- best parameter settings for the differentation method
@@ -147,7 +167,7 @@ def optimize(func, x, dt, init_conds={}, dxdt_truth=None, tvgamma=1e-2, padding=
147167
_obj_fun = partial(_objective_function, func=func, x=x, dt=dt, singleton_params=singleton_params,
148168
search_space_types=search_space_types, dxdt_truth=dxdt_truth, metric=metric, tvgamma=tvgamma,
149169
padding=padding)
150-
_minimize = partial(scipy.optimize.minimize, _obj_fun, method=opt_method, bounds=bounds, options=opt_kwargs)
170+
_minimize = partial(scipy.optimize.minimize, _obj_fun, method=opt_method, bounds=bounds, options={'maxiter':maxiter})
151171

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

pynumdiff/optimize/total_variation_regularization/__init__.py

Lines changed: 0 additions & 9 deletions
This file was deleted.

pynumdiff/optimize/total_variation_regularization/__total_variation_regularization__.py

Lines changed: 0 additions & 162 deletions
This file was deleted.

pynumdiff/tests/test_optimize.py

Lines changed: 29 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
import numpy as np
22
from pytest import mark, skip
33

4-
#from pynumdiff.optimize.total_variation_regularization import *
5-
#from pynumdiff.optimize.kalman_smooth import constant_velocity, constant_acceleration, \
6-
# constant_jerk
7-
from pynumdiff.utils.simulate import pi_control
8-
94
from ..finite_difference import first_order as iterated_finite_difference # actually second order
105
from ..smooth_finite_difference import mediandiff, meandiff, gaussiandiff, friedrichsdiff, butterdiff, splinediff
116
from ..linear_model import spectraldiff, polydiff, savgoldiff
7+
from ..total_variation_regularization import velocity, acceleration, iterative_velocity
128
from ..optimize import optimize
9+
from ..utils.simulate import pi_control
1310

1411

1512
# simulation
@@ -51,62 +48,49 @@ def test_friedrichsdiff():
5148
assert params2['window_size'] == 1
5249

5350
def test_butterdiff():
54-
params1, val1 = optimize(butterdiff, x, dt, init_conds={'num_iterations':1}, tvgamma=tvgamma, dxdt_truth=dxdt_truth, opt_kwargs={'maxiter': 20})
55-
params2, val2 = optimize(butterdiff, x, dt, init_conds={'num_iterations':1}, tvgamma=0, dxdt_truth=None, opt_kwargs={'maxiter': 20})
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)
5653

5754
assert params1['filter_order'] == 8
5855
np.testing.assert_almost_equal(params1['cutoff_freq'], 0.161, decimal=3)
5956
assert params2['filter_order'] == 3
6057
np.testing.assert_almost_equal(params2['cutoff_freq'], 0.99, decimal=3)
6158

6259
def test_splinediff():
63-
params1, val1 = optimize(splinediff, x, dt, tvgamma=tvgamma, dxdt_truth=dxdt_truth, opt_kwargs={'maxiter': 20})
64-
params2, val2 = optimize(splinediff, x, dt, tvgamma=0, dxdt_truth=None, opt_kwargs={'maxiter': 20})
60+
params1, val1 = optimize(splinediff, x, dt, tvgamma=tvgamma, dxdt_truth=dxdt_truth, maxiter=20)
61+
params2, val2 = optimize(splinediff, x, dt, tvgamma=0, dxdt_truth=None, maxiter=20)
6562

6663
assert (params1['order'], params1['num_iterations']) == (4, 1)
6764
np.testing.assert_almost_equal(params1['s'], 0.0146, decimal=3)
6865
assert (params2['order'], params2['num_iterations']) == (4, 1)
6966
np.testing.assert_almost_equal(params2['s'], 0.01, decimal=3)
7067

71-
# def test_iterative_velocity():
72-
# params1, val1 = iterative_velocity(x, dt, params=None, tvgamma=tvgamma, dxdt_truth=dxdt_truth)
73-
# params2, val2 = iterative_velocity(x, dt, params=None, tvgamma=0, dxdt_truth=None)
74-
# np.testing.assert_array_less( np.abs(params1[0] - 2), 1.001)
75-
# np.testing.assert_array_less( np.abs(params2[0] - 2), 1.001)
76-
77-
# np.testing.assert_almost_equal(params1[1], 0.0001, decimal=4)
78-
# np.testing.assert_almost_equal(params2[1], 0.0001, decimal=4)
68+
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)
7971

80-
# #self.assertListEqual(params1, [2, 0.0001])
81-
# #self.assertListEqual(params2, [2, 0.0001])
72+
np.testing.assert_almost_equal(params1['gamma'], 0.0001, decimal=4)
73+
np.testing.assert_almost_equal(params2['gamma'], 0.0001, decimal=4)
8274

83-
# def test_velocity():
84-
# try:
85-
# import cvxpy
86-
# except:
87-
# pytest.skip("could not import cvxpy, skipping test_velocity", allow_module_level=True)
75+
def test_velocity():
76+
try: import cvxpy
77+
except: skip("could not import cvxpy, skipping test_velocity")
8878

89-
# params1, val1 = velocity(x, dt, params=None, tvgamma=tvgamma, dxdt_truth=dxdt_truth)
90-
# params2, val2 = velocity(x, dt, params=None, tvgamma=0, dxdt_truth=None)
91-
# param1_error = np.abs(params1[0] - 0.07218)
92-
# param2_error = np.abs(params2[0] - 0.0001)
79+
params1, val1 = optimize(velocity, x, dt, tvgamma=tvgamma, dxdt_truth=dxdt_truth, maxiter=20)
80+
params2, val2 = optimize(velocity, x, dt, tvgamma=0, dxdt_truth=None, maxiter=20)
9381

94-
# np.testing.assert_array_less(param1_error, 2)
95-
# np.testing.assert_array_less(param2_error, 2)
82+
np.testing.assert_almost_equal(params1['gamma'], 0.0721, decimal=3)
83+
np.testing.assert_almost_equal(params2['gamma'], 1e-4, decimal=4)
9684

97-
# def test_acceleration():
98-
# try:
99-
# import cvxpy
100-
# except:
101-
# pytest.skip("could not import cvxpy, skipping test_acceleration", allow_module_level=True)
85+
def test_acceleration():
86+
try: import cvxpy
87+
except: pytest.skip("could not import cvxpy, skipping test_acceleration")
10288

103-
# params1, val1 = acceleration(x, dt, params=None, tvgamma=tvgamma, dxdt_truth=dxdt_truth)
104-
# params2, val2 = acceleration(x, dt, params=None, tvgamma=0, dxdt_truth=None)
105-
# param1_error = np.abs(params1[0] - 0.1447)
106-
# param2_error = np.abs(params2[0] - 0.0001)
89+
params1, val1 = optimize(acceleration, x, dt, tvgamma=tvgamma, dxdt_truth=dxdt_truth, maxiter=20)
90+
params2, val2 = optimize(acceleration, x, dt, tvgamma=0, dxdt_truth=None, maxiter=20)
10791

108-
# np.testing.assert_array_less(param1_error, 2)
109-
# np.testing.assert_array_less(param2_error, 2)
92+
np.testing.assert_almost_equal(params1['gamma'], 0.144, decimal=3)
93+
np.testing.assert_almost_equal(params2['gamma'], 1e-4, decimal=4)
11094

11195
def test_savgoldiff():
11296
params1, val1 = optimize(savgoldiff, x, dt, tvgamma=tvgamma, dxdt_truth=dxdt_truth)
@@ -127,12 +111,7 @@ def test_polydiff():
127111
assert (params2['poly_order'], params2['window_size']) == (4, 10)
128112

129113
# def test_chebydiff(self):
130-
# try:
131-
# import pychebfun
132-
# except:
133-
# pytest.skip("could not import pychebfun, skipping test_chebydiff", allow_module_level=True)
134-
135-
# params1, val1 = chebydiff(x, dt, params=None, tvgamma=tvgamma, dxdt_truth=dxdt_truth)
136-
# params2, val2 = chebydiff(x, dt, params=None, tvgamma=0, dxdt_truth=None)
137-
# self.assertListEqual(params1, [9, 108])
138-
# self.assertListEqual(params2, [9, 94])
114+
# params1, val1 = optimize(chebydiff, x, dt, tvgamma=tvgamma, dxdt_truth=dxdt_truth)
115+
# params2, val2 = optimize(chebydiff, x, dt, tvgamma=0, dxdt_truth=None)
116+
# assert params1 == [9, 108]
117+
# assert params2 == [9, 94]

0 commit comments

Comments
 (0)