Update sync-notebook

This commit is contained in:
D-X-Y 2021-04-22 23:32:26 +08:00
parent 731458f890
commit 660cad8406
5 changed files with 79 additions and 35 deletions

View File

@ -3,6 +3,7 @@
#####################################################
import math
import abc
import copy
import numpy as np
from typing import Optional
import torch
@ -29,7 +30,7 @@ class FitFunc(abc.ABC):
raise ValueError("The {:} is None".format(key))
@abc.abstractmethod
def __getitem__(self, x):
def __call__(self, x):
raise NotImplementedError
@abc.abstractmethod
@ -96,7 +97,7 @@ class QuadraticFunc(FitFunc):
def __init__(self, list_of_points=None):
super(QuadraticFunc, self).__init__(3, list_of_points)
def __getitem__(self, x):
def __call__(self, x):
self.check_valid()
return self._params[0] * x * x + self._params[1] * x + self._params[2]
@ -118,7 +119,7 @@ class CubicFunc(FitFunc):
def __init__(self, list_of_points=None):
super(CubicFunc, self).__init__(4, list_of_points)
def __getitem__(self, x):
def __call__(self, x):
self.check_valid()
return (
self._params[0] * x ** 3
@ -146,7 +147,7 @@ class QuarticFunc(FitFunc):
def __init__(self, list_of_points=None):
super(QuarticFunc, self).__init__(5, list_of_points)
def __getitem__(self, x):
def __call__(self, x):
self.check_valid()
return (
self._params[0] * x ** 4
@ -183,13 +184,14 @@ class DynamicQuadraticFunc(FitFunc):
super(DynamicQuadraticFunc, self).__init__(3, list_of_points)
self._timestamp = None
def __getitem__(self, x):
def __call__(self, x):
self.check_valid()
return (
self._params[0][self._timestamp] * x * x
+ self._params[1][self._timestamp] * x
+ self._params[2][self._timestamp]
)
a = self._params[0][self._timestamp]
b = self._params[1][self._timestamp]
c = self._params[2][self._timestamp]
convert_fn = lambda x: x[-1] if isinstance(x, (tuple, list)) else x
a, b, c = convert_fn(a), convert_fn(b), convert_fn(c)
return a * x * x + b * x + c
def _getitem(self, x, weights):
raise NotImplementedError

View File

@ -77,7 +77,7 @@ class SinGenerator(UnifiedSplit, data.Dataset):
fitting_data.append((inter_value, math.pi * (2 * i + _phase)))
self._period_phase_shift = QuarticFunc(fitting_data)
UnifiedSplit.__init__(self, self._total_num, mode)
self._transform = lambda x: x
self._transform = None
def __iter__(self):
self._iter_num = 0
@ -92,14 +92,20 @@ class SinGenerator(UnifiedSplit, data.Dataset):
def set_transform(self, transform):
self._transform = transform
def transform(self, x):
if self._transform is None:
return x
else:
return self._transform(x)
def __getitem__(self, index):
assert 0 <= index < len(self), "{:} is not in [0, {:})".format(index, len(self))
index = self._indexes[index]
position = self._interval * index
value = self._amplitude_scale[position] * math.sin(
self._period_phase_shift[position]
value = self._amplitude_scale(position) * math.sin(
self._period_phase_shift(position)
)
return index, position, self._transform(value)
return index, position, self.transform(value)
def __len__(self):
return len(self._indexes)

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -15,6 +15,7 @@ if str(lib_dir) not in sys.path:
from datasets import QuadraticFunc
from datasets import ConstantGenerator, SinGenerator
from datasets import DynamicQuadraticFunc
class TestQuadraticFunc(unittest.TestCase):
@ -24,20 +25,20 @@ class TestQuadraticFunc(unittest.TestCase):
function = QuadraticFunc([[0, 1], [0.5, 4], [1, 1]])
print(function)
for x in (0, 0.5, 1):
print("f({:})={:}".format(x, function[x]))
print("f({:})={:}".format(x, function(x)))
thresh = 0.2
self.assertTrue(abs(function[0] - 1) < thresh)
self.assertTrue(abs(function[0.5] - 4) < thresh)
self.assertTrue(abs(function[1] - 1) < thresh)
self.assertTrue(abs(function(0) - 1) < thresh)
self.assertTrue(abs(function(0.5) - 4) < thresh)
self.assertTrue(abs(function(1) - 1) < thresh)
def test_none(self):
function = QuadraticFunc()
function.fit([[0, 1], [0.5, 4], [1, 1]], max_iter=3000, verbose=True)
function.fit([[0, 1], [0.5, 4], [1, 1]], max_iter=3000, verbose=False)
print(function)
thresh = 0.2
self.assertTrue(abs(function[0] - 1) < thresh)
self.assertTrue(abs(function[0.5] - 4) < thresh)
self.assertTrue(abs(function[1] - 1) < thresh)
thresh = 0.15
self.assertTrue(abs(function(0) - 1) < thresh)
self.assertTrue(abs(function(0.5) - 4) < thresh)
self.assertTrue(abs(function(1) - 1) < thresh)
class TestConstantGenerator(unittest.TestCase):
@ -59,3 +60,27 @@ class TestSinGenerator(unittest.TestCase):
assert i == idx, "First loop: {:} vs {:}".format(i, idx)
for i, (idx, t, x) in enumerate(dataset):
assert i == idx, "Second loop: {:} vs {:}".format(i, idx)
class TestDynamicFunc(unittest.TestCase):
"""Test DynamicQuadraticFunc."""
def test_simple(self):
timestamps = 30
function = DynamicQuadraticFunc()
function_param = dict()
function_param[0] = SinGenerator(
num=timestamps, num_sin_phase=4, phase_shift=1.0, max_amplitude=1.0
)
function_param[1] = ConstantGenerator(constant=0.9)
function_param[2] = SinGenerator(
num=timestamps, num_sin_phase=5, phase_shift=0.4, max_amplitude=0.9
)
function.set(function_param)
print(function)
with self.assertRaises(TypeError) as context:
function(0)
function.set_timestamp(1)
print(function(2))