Source code for discrete_optimization.generic_tools.unsat_tools

"""Tools for explaining unsatisfiability."""
from abc import abstractmethod
from collections.abc import MutableSequence
from typing import Any, Iterable, Optional, overload

Constraint = Any


[docs] class MetaConstraint(MutableSequence[Constraint]): """Meta constraint Constraint gathering several finer constraints. For instance, in coloring problems, it could be "colors of neigbours of the given node must be different of its color" """ def __init__( self, name: str, constraints: Optional[list[Constraint]] = None, metadata=None ): self.name = name if constraints is None: constraints = [] self.constraints = constraints if metadata is None: metadata = {} self.metadata = metadata def __repr__(self) -> str: return f"{self.__class__.__name__}({self.name})" def __len__(self) -> int: return len(self.constraints)
[docs] def insert(self, index: int, value: Constraint) -> None: self.constraints.insert(index, value)
@overload @abstractmethod def __getitem__(self, index: int) -> Constraint: ... @overload @abstractmethod def __getitem__(self, index: slice) -> MutableSequence[Constraint]: ... def __getitem__(self, index: int) -> Constraint: return self.constraints[index] @overload @abstractmethod def __setitem__(self, index: int, value: Constraint) -> None: ... @overload @abstractmethod def __setitem__(self, index: slice, value: Iterable[Constraint]) -> None: ... def __setitem__(self, index: int, value: Constraint) -> None: self.constraints[index] = value @overload @abstractmethod def __delitem__(self, index: int) -> None: ... @overload @abstractmethod def __delitem__(self, index: slice) -> None: ... def __delitem__(self, index: int) -> None: del self.constraints[index]