def __init__(self, name: str, first: MathExpr, last: MathExpr, size: MathExpr) -> None: first_num = first.simplified() if not isinstance(first_num, Number): raise ModelError(f'first of "{name}" contains variable') last_num = last.simplified() if not isinstance(last_num, Number): raise ModelError(f'last of "{name}" contains variable') if first_num < Number(0): raise ModelError(f'first of "{name}" negative') if first_num > last_num: raise ModelError(f'range of "{name}" negative') size_num = size.simplified() if not isinstance(size_num, Number): raise ModelError(f'size of "{name}" contains variable') if log(int(last_num) + 1) / log(2) > int(size_num): raise ModelError(f'size for "{name}" too small') super().__init__(name) self.__first = first self.__last = last self.__size = size constraints: LogExpr = TRUE if self.first.simplified() != self.base_first.simplified(): constraints = GreaterEqual(Value(self.name), self.first) if self.last.simplified() != self.base_last.simplified(): constraints = And(constraints, LessEqual(Value(self.name), self.last)) self.__constraints = constraints.simplified()
def constraints(self, name: str, proof: bool = False) -> Expr: if proof: return And( GreaterEqual(Variable(name), self.first), LessEqual(Variable(name), self.last) ) c: Expr = TRUE if self.first.simplified() != self.base_first.simplified(): c = GreaterEqual(Variable(name), self.first) if self.last.simplified() != self.base_last.simplified(): c = And(c, LessEqual(Variable(name), self.last)) return c.simplified()