diff --git a/firanka/builder.py b/firanka/builder.py new file mode 100644 index 0000000000000000000000000000000000000000..1b15543414737fc5369ddbc084d6356eee76e4bc --- /dev/null +++ b/firanka/builder.py @@ -0,0 +1,44 @@ +# coding=UTF-8 +from __future__ import print_function, absolute_import, division +import six +import logging +import copy +from .series import Series, DiscreteSeries +from .ranges import Range + +""" +Update knowledge of current discrete series +""" + +__all__ = [ + 'DiscreteKnowledgeBuilder', +] + +class DiscreteKnowledgeBuilder(object): + def __init__(self, series): + + if not isinstance(series, DiscreteSeries): + raise TypeError('discrete knowledge builder supports only discrete series') + + self.new_data = {} + self.domain = series.domain + self.series = series + + def put(self, index, value): + + if index not in self.domain: + if index <= self.domain.start: + self.domain = Range(index, self.domain.stop, True, self.domain.right_inc) + if index >= self.domain.stop: + self.domain = Range(self.domain.start, index, self.domain.left_inc, True) + + self.new_data[index] = value + + def update_series(self): + """:return: a new DiscreteSeries instance""" + + new_data = copy.copy(self.series.data) + for k,v in self.new_data.items(): + new_data.add((k,v)) + + return DiscreteSeries(new_data, self.domain) diff --git a/tests/test_builder.py b/tests/test_builder.py new file mode 100644 index 0000000000000000000000000000000000000000..0c2b7043bff8be5e0f696538263c9576757b9325 --- /dev/null +++ b/tests/test_builder.py @@ -0,0 +1,24 @@ +# coding=UTF-8 +from __future__ import print_function, absolute_import, division +import six +import unittest + +from firanka.builder import DiscreteKnowledgeBuilder +from firanka.series import DiscreteSeries + + +class TestBuilder(unittest.TestCase): + def test_t1(self): + + ser = DiscreteSeries([(0,1), (1,2)]) + + kb = DiscreteKnowledgeBuilder(ser) + + kb.put(3, 4) + kb.put(-1, 5) + kb.put(-1, 6) + + s2 = kb.update_series() + + self.assertTrue(s2.domain, '<-1;3>') + self.assertEqual(s2.data,[(-1,6), (0,1), (1,2), (3,4)]) diff --git a/tests/test_series.py b/tests/test_series.py index 4ef0223daf5f134f00ff28a121adaa1e3d4ad9ed..627ecfa531528f98020ac510be8981bcc231cadf 100644 --- a/tests/test_series.py +++ b/tests/test_series.py @@ -198,6 +198,8 @@ class TestModuloSeries(unittest.TestCase): self.assertEqual(series.period, 3.0) + self.assertEqual(series.eval_points([-1,0,1]), [1,2,3]) + self.assertEqual(series.eval_points([-5,-4,-3,-2,-1,0,1,2,3,4,5]), [ 3, 1, 2, 3, 1,2,3,1,2,3,1])