Source code for timeseries.test_mollifier
r"""
Test the mollifier code
Copyright
---------
- This file is part of https://github.com/geomdata/gda-public/
- 2015, 2016, 2017 by Geometric Data Analytics, Inc. (http://geomdata.com)
- AGPL license. See `LICENSE` or https://github.com/geomdata/gda-public/blob/master/LICENSE
"""
import numpy
from timeseries import curve_geometry
[docs]class TestMollifier:
[docs] def setup(self):
a = -1.0
b = 1.0
h = 0.3
m = 100
sigma = .1
numpy.random.seed(seed=70713)
# set up original function and noisy version
self.dt = (b - a)/m
self.time = a + self.dt * numpy.arange(m)
error = numpy.random.uniform(low=-1.0, high=1.0, size=m)*sigma
fWithNoise = numpy.cos(self.time) + error
fWithNoise[int(m / 2)] = 1.4
self.position = fWithNoise
self.num_refinements = 3
[docs] def teardown(self):
del self.time
del self.dt
del self.position
del self.num_refinements
[docs] def setup_method(self, function):
pass
[docs] def teardown_method(self, function):
pass
[docs] def test_refinement_counts(self):
point_count = self.time.shape[0]
for refinement in range(self.num_refinements):
refined = curve_geometry.mollifier(self.time, self.position,
(refinement+1), width=0.3)
assert (refinement+1)*point_count==refined[0,:].shape[0],\
"""input time shape {} and refined shape {} are mismatched
for refinement {}.""".format(self.time.shape[0],
refined[0,:].shape[0],
(refinement+1))
[docs] def test_resonable_reconstruction(self):
for refinement in range(self.num_refinements):
R = curve_geometry.mollifier(self.time, self.position,
2**(refinement+1), width=0.3)
# \|cos(t)\|_\infty = 1 \implies rel_err = abs_err
err = numpy.linalg.norm((numpy.cos(R[0,:])-R[1,:]),ord=numpy.inf)
assert err <= 0.1,\
"""Failed to make a resonable reconstruction,
relative error {} > 0.1""".format(err)
if __name__ == '__main__':
T = TestMollifier()
T.setup()
T.test_refinement_counts()
T.teardown()