def test_interval_overlaps_point(): iv = Interval(0, 10) assert not iv.overlaps(-5) assert iv.overlaps(0) assert iv.overlaps(5) assert not iv.overlaps(10) assert not iv.overlaps(15)
def __getitem__(self, index): if type(index) is slice: if index.step is not None: raise ValueError("Slice indexing is used for intervals, which do not have a step.") iv = Interval(index.start, index.stop) result = {x.data for x in self.history[iv]} result.update(x[0] for x in self.current.items() if iv.overlaps(Interval(begin=x[1], end=None))) else: result = {x.data for x in self.history[index]} result.update(item_ for item_, time_ in self.current.items() if time_ <= index) return result
def diff(left: Interval, right: Interval) -> List[Interval]: """ Find the regions in left, without the intersection with right. Examples: >>> left = Interval(0, 5) >>> right = Interval(3, 10) >>> diff(left, right) [Interval(0, 3)] >>> left = Interval(0, 10) >>> right = Interval(3, 6) >>> diff(left, right) [Interval(0, 3), Interval(6, 10)] >>> left = Interval(3, 6) >>> right = Interval(0, 10) >>> diff(left, right) [] >>> left = Interval(0, 10) >>> right = Interval(10, 20) >>> diff(left, right) [Interval(0, 10)] >>> left = Interval(5, 10) >>> right = Interval(0, 4) >>> diff(left, right) [Interval(5, 10)] >>> left = Interval(5, 10) >>> right = Interval(0, 7) >>> diff(left, right) [Interval(7, 10)] """ if not left.overlaps(right): return [left] lstart = min([left.begin, left.end]) lend = max([left.begin, left.end]) rstart = min([right.begin, right.end]) rend = max([right.begin, right.end]) out = [] if rstart > lstart: out.append(Interval(lstart, min([rstart, lend]))) if rend < lend: out.append(Interval(max([lstart, rend]), lend)) return out
def test_interval_overlaps_interval(): iv0 = Interval(0, 10) iv1 = Interval(-10, -5) iv2 = Interval(-10, 0) iv3 = Interval(-10, 5) iv4 = Interval(-10, 10) iv5 = Interval(-10, 20) iv6 = Interval(0, 20) iv7 = Interval(5, 20) iv8 = Interval(10, 20) iv9 = Interval(15, 20) assert iv0.overlaps(iv0) assert not iv0.overlaps(iv1) assert not iv0.overlaps(iv2) assert iv0.overlaps(iv3) assert iv0.overlaps(iv4) assert iv0.overlaps(iv5) assert iv0.overlaps(iv6) assert iv0.overlaps(iv7) assert not iv0.overlaps(iv8) assert not iv0.overlaps(iv9)
def test_interval_overlaps_range(): iv0 = Interval(0, 10) iv1 = (-10, -5) iv2 = (-10, 0) iv3 = (-10, 5) iv4 = (-10, 10) iv5 = (-10, 20) iv6 = (0, 20) iv7 = (5, 20) iv8 = (10, 20) iv9 = (15, 20) assert iv0.overlaps(iv0) assert not iv0.overlaps(*iv1) assert not iv0.overlaps(*iv2) assert iv0.overlaps(*iv3) assert iv0.overlaps(*iv4) assert iv0.overlaps(*iv5) assert iv0.overlaps(*iv6) assert iv0.overlaps(*iv7) assert not iv0.overlaps(*iv8) assert not iv0.overlaps(*iv9)