from numba.experimental import structref
from numba import njit
import numpy as np
[docs]
class Interval(structref.StructRefProxy):
def __new__(cls, lower, upper, s=False):
return structref.StructRefProxy.__new__(cls, lower, upper, s, lower, upper)
@property
@njit
[docs]
def lower(self):
return self.l
@property
@njit
[docs]
def upper(self):
return self.u
@property
@njit
[docs]
def static(self):
return self.s
@property
@njit
[docs]
def prev_lower(self):
return self.prev_l
@property
@njit
[docs]
def prev_upper(self):
return self.prev_u
@njit
[docs]
def set_lower_upper(self, lower, upper):
self.l = lower
self.u = upper
@njit
[docs]
def reset(self):
self.prev_l = self.l
self.prev_u = self.u
self.l = 0
self.u = 1
@njit
[docs]
def set_static(self, static):
self.s = static
@njit
[docs]
def is_static(self):
return self.s
@njit
[docs]
def has_changed(self):
if self.lower==self.prev_lower and self.upper==self.prev_upper:
return False
else:
return True
@njit
[docs]
def intersection(self, interval):
lower = max(self.lower, interval.lower)
upper = min(self.upper, interval.upper)
if lower > upper:
lower = np.float64(0)
upper = np.float64(1)
return Interval(lower, upper, False, self.lower, self.upper)
[docs]
def to_str(self):
return self.__repr__()
def __eq__(self, interval):
if interval.lower==self.lower and interval.upper==self.upper:
return True
else:
return False
def __repr__(self):
return f'[{self.lower},{self.upper}]'
def __hash__(self):
return hash((self.lower, self.upper))
def __contains__(self, item):
if self.lower <= item.lower and self.upper >= item.upper:
return True
else:
return False