def test_contained_union(self):
        intervals = Intervals(0, True, 10, True)
        self.assertEqual("[0, 10]", str(intervals))

        uniend = Intervals(0, False, 5, False)
        intervals.union(uniend)
        self.assertEqual("[0, 10]", str(intervals))
    def test_simple_add(self):
        intervals = Intervals(0, True, 10, True)
        self.assertEqual("[0, 10]", str(intervals))

        addend = Intervals(0, False, 5, True)
        intervals.add(addend)
        self.assertEqual("(0, 15]", str(intervals))
Пример #3
0
    def update_state(self, q):
        proceeding_edges = self.automaton.get_proceeding_edges(q)

        for p in proceeding_edges:
            for edge in proceeding_edges[p]:
                if self.automaton.is_invisible(p):
                    continue

                for sub_interval in self.intervals[p].values():
                    if sub_interval is None:
                        continue

                    if sub_interval.is_empty():
                        continue

                    op = edge.get_operation()
                    if op is not None:
                        z = edge.get_operation().get_value()
                    else:
                        z = 0

                    new_interval = deepcopy(sub_interval)

                    if z > 0:
                        addend = Intervals(0, False, z, True)
                        new_interval.add(addend)
                    elif z < 0:
                        addend = Intervals(z, True, 0, False)
                        new_interval.add(addend)

                    self.reaches[q].update_reach(p, new_interval)
                    self.reaches[q].rescale_reach(p, self.lower_bound,
                                                  self.upper_bound)
                    self.reaches[q].ensure_reach_in_node_bounds(p)
                    self.reaches[q].remove_inconsistencies()
    def test_interval_creation(self):
        intervals = Intervals(0, True, 10, True)
        self.assertEqual("[0, 10]", str(intervals))

        intervals = Intervals(0, False, 10, True)
        self.assertEqual("(0, 10]", str(intervals))

        intervals = Intervals(0, True, 10, False)
        self.assertEqual("[0, 10)", str(intervals))

        intervals = Intervals(0, False, 10, False)
        self.assertEqual("(0, 10)", str(intervals))
    def test_merge_multiple_union(self):
        intervals = Intervals(0, True, 10, True)
        self.assertEqual("[0, 10]", str(intervals))

        uniend = Intervals(15, False, 16, False)
        intervals.union(uniend)
        self.assertEqual("[0, 10] (15, 16)", str(intervals))

        uniend = Intervals(-15, False, 16, False)
        intervals.union(uniend)
        self.assertEqual("(-15, 16)", str(intervals))
    def test_right_extension_union(self):
        intervals = Intervals(0, True, 10, True)
        self.assertEqual("[0, 10]", str(intervals))

        uniend = Intervals(0, False, 15, False)
        intervals.union(uniend)
        self.assertEqual("[0, 15)", str(intervals))

        uniend = Intervals(15, False, 15, True)
        intervals.union(uniend)
        self.assertEqual("[0, 15]", str(intervals))
    def test_left_extension_union(self):
        intervals = Intervals(0, True, 10, True)
        self.assertEqual("[0, 10]", str(intervals))

        uniend = Intervals(-5, False, 0, False)
        intervals.union(uniend)
        self.assertEqual("(-5, 10]", str(intervals))

        uniend = Intervals(-5, True, 0, False)
        intervals.union(uniend)
        self.assertEqual("[-5, 10]", str(intervals))
Пример #8
0
    def add_interval(self, state, origin, low, inc_low, high, inc_high):
        if low > self.upper_bound or high < self.lower_bound:
            return

        high = min(self.upper_bound, high)
        high = max(self.lower_bound, high)

        low = max(self.automaton.lower_bound, low)
        low = min(self.automaton.upper_bound, low)

        interval = Intervals(low, inc_low, high, inc_high)
        self.reaches[state].update_reach(origin, interval)
 def union(self, low, incl_low, high, incl_high):
     interval = Intervals(low, incl_low, high, incl_high)
     self.intervals.union(interval)
 def initialise_intervals(self, low, incl_low, high, incl_high):
     self.intervals = Intervals(low, incl_low, high, incl_high)
class TestIntervalUnion(unittest.TestCase):
    def initialise_intervals(self, low, incl_low, high, incl_high):
        self.intervals = Intervals(low, incl_low, high, incl_high)

    def union(self, low, incl_low, high, incl_high):
        interval = Intervals(low, incl_low, high, incl_high)
        self.intervals.union(interval)

    def assert_interval_matches(self, expected):
        if expected is not None:
            self.assertEqual(expected, str(self.intervals))
        else:
            self.assertIsNone(self.intervals)

    def test_union_no_overlap(self):
        self.initialise_intervals(-100, True, 100, False)
        self.assert_interval_matches("[-100, 100)")

        self.union(200, True, 300, True)
        self.assert_interval_matches("[-100, 100) [200, 300]")

    def test_union_equivalent(self):
        self.initialise_intervals(-100, True, 100, True)
        self.assert_interval_matches("[-100, 100]")

        self.union(-100, True, 100, True)
        self.assert_interval_matches("[-100, 100]")

    def test_union_overlap_lower(self):
        self.initialise_intervals(100, False, 200, True)
        self.assert_interval_matches("(100, 200]")

        self.union(150, True, 300, False)
        self.assert_interval_matches("(100, 300)")

    def test_union_overlap_upper(self):
        self.initialise_intervals(-20, False, -10, True)
        self.assert_interval_matches("(-20, -10]")

        self.union(-10, True, 300, False)
        self.assert_interval_matches("(-20, 300)")

    def test_union_overlap_on_bound(self):
        self.initialise_intervals(20, True, 50, True)
        self.assert_interval_matches("[20, 50]")

        self.union(50, False, 100, False)
        self.assert_interval_matches("[20, 100)")

        self.union(100, True, 150, False)
        self.assert_interval_matches("[20, 150)")

    def test_union_with_both_intervals_extensions(self):
        self.initialise_intervals(-1127, False, 5, False)
        self.assert_interval_matches("(-1127, 5)")

        self.union(5, False, 614, False)
        self.assert_interval_matches("(-1127, 5) (5, 614)")

        self.union(5, False, 613, False)
        self.assert_interval_matches("(-1127, 5) (5, 614)")
    def test_boundary_union(self):
        intervals = Intervals(0, False, 10, True)
        self.assertEqual("(0, 10]", str(intervals))

        uniend = Intervals(10, False, 16, False)
        intervals.union(uniend)
        self.assertEqual("(0, 16)", str(intervals))

        uniend = Intervals(16, False, 20, False)
        intervals.union(uniend)
        self.assertEqual("(0, 16) (16, 20)", str(intervals))

        uniend = Intervals(-5, False, 0, False)
        intervals.union(uniend)
        self.assertEqual("(-5, 0) (0, 16) (16, 20)", str(intervals))
    def test_new_interval_union(self):
        intervals = Intervals(0, True, 10, True)
        self.assertEqual("[0, 10]", str(intervals))

        uniend = Intervals(15, False, 16, False)
        intervals.union(uniend)
        self.assertEqual("[0, 10] (15, 16)", str(intervals))

        uniend = Intervals(-5, False, -3, False)
        intervals.union(uniend)
        self.assertEqual("(-5, -3) [0, 10] (15, 16)", str(intervals))

        uniend = Intervals(13, True, 14, True)
        intervals.union(uniend)
        self.assertEqual("(-5, -3) [0, 10] [13, 14] (15, 16)", str(intervals))
    def test_expansion_boundaries(self):
        original = Intervals(0, True, 10, True)
        expansion = Intervals(0, True, 10, False)

        is_expansion = expansion.is_expansion_of(original)
        self.assertFalse(is_expansion)
        is_expansion = original.is_expansion_of(expansion)
        self.assertTrue(is_expansion)

        original = Intervals(0, False, 10, True)
        expansion = Intervals(0, False, 10, False)

        is_expansion = expansion.is_expansion_of(original)
        self.assertFalse(is_expansion)
        is_expansion = original.is_expansion_of(expansion)
        self.assertTrue(is_expansion)

        original = Intervals(0, False, 3, True)
        expansion = Intervals(0, False, 3, True)

        is_expansion = expansion.is_expansion_of(original)
        self.assertTrue(is_expansion)
        is_expansion = original.is_expansion_of(expansion)
        self.assertTrue(is_expansion)
    def test_expansion(self):
        original = Intervals(0, True, 10, True)
        expansion = Intervals(-15, False, 16, False)

        is_expansion = expansion.is_expansion_of(original)
        self.assertTrue(is_expansion)
        is_expansion = original.is_expansion_of(expansion)
        self.assertFalse(is_expansion)

        original = Intervals(0, True, 10, True)
        expansion = Intervals(-15, False, -10, False)

        is_expansion = expansion.is_expansion_of(original)
        self.assertFalse(is_expansion)
        is_expansion = original.is_expansion_of(expansion)
        self.assertFalse(is_expansion)

        original = Intervals(0, True, 10, True)
        expansion = Intervals(-15, False, 5, False)

        is_expansion = expansion.is_expansion_of(original)
        self.assertFalse(is_expansion)
        is_expansion = original.is_expansion_of(expansion)
        self.assertFalse(is_expansion)

        original = Intervals(0, True, 10, True)
        expansion = Intervals(5, False, 20, False)

        is_expansion = expansion.is_expansion_of(original)
        self.assertFalse(is_expansion)
        is_expansion = original.is_expansion_of(expansion)
        self.assertFalse(is_expansion)