We call "domain" any subset of Int64 = [kint64min, kint64max].
This class can be used to represent such set efficiently as a sorted and non-adjacent list of intervals. This is efficient as long as the size of such list stays reasonable.In the comments below, the domain of *this will always be written 'D'.
Definition at line 70 of file sorted_interval_list.h.
Public Member Functions | |
| Domain () | |
| By default, Domain will be empty. More... | |
| Domain (int64 value) | |
| Constructor for the common case of a singleton domain. More... | |
| Domain (int64 left, int64 right) | |
| Constructor for the common case of a single interval [left, right]. More... | |
| std::vector< int64 > | FlattenedIntervals () const |
| This method returns the flattened list of interval bounds of the domain. More... | |
| bool | IsEmpty () const |
| Returns true if this is the empty set. More... | |
| int64 | Size () const |
| Returns the number of elements in the domain. It is capped at kint64max. More... | |
| int64 | Min () const |
| Returns the domain min value. More... | |
| int64 | Max () const |
| Returns the domain max value. More... | |
| bool | Contains (int64 value) const |
| Returns true iff value is in Domain. More... | |
| bool | IsIncludedIn (const Domain &domain) const |
| Returns true iff D is included in the given domain. More... | |
| Domain | Complement () const |
| Returns the set Int64 ∖ D. More... | |
| Domain | Negation () const |
| Returns {x ∈ Int64, ∃ e ∈ D, x = -e}. More... | |
| Domain | IntersectionWith (const Domain &domain) const |
| Returns the set D ∩ domain. More... | |
| Domain | UnionWith (const Domain &domain) const |
| Returns the set D ∪ domain. More... | |
| Domain | AdditionWith (const Domain &domain) const |
| Returns {x ∈ Int64, ∃ a ∈ D, ∃ b ∈ domain, x = a + b}. More... | |
| Domain | MultiplicationBy (int64 coeff, bool *exact=nullptr) const |
| Returns {x ∈ Int64, ∃ e ∈ D, x = e * coeff}. More... | |
| Domain | RelaxIfTooComplex () const |
| If NumIntervals() is too large, this return a superset of the domain. More... | |
| Domain | ContinuousMultiplicationBy (int64 coeff) const |
| Returns a super-set of MultiplicationBy() to avoid the explosion in the representation size. More... | |
| Domain | ContinuousMultiplicationBy (const Domain &domain) const |
| Returns a super-set of MultiplicationBy() to avoid the explosion in the representation size. More... | |
| Domain | DivisionBy (int64 coeff) const |
| Returns {x ∈ Int64, ∃ e ∈ D, x = e / coeff}. More... | |
| Domain | InverseMultiplicationBy (const int64 coeff) const |
| Returns {x ∈ Int64, ∃ e ∈ D, x * coeff = e}. More... | |
| Domain | SimplifyUsingImpliedDomain (const Domain &implied_domain) const |
| Advanced usage. More... | |
| std::string | ToString () const |
| Returns a compact std::string of a vector of intervals like "[1,4][6][10,20]". More... | |
| bool | operator< (const Domain &other) const |
| Lexicographic order on the intervals() representation. More... | |
| bool | operator== (const Domain &other) const |
| bool | operator!= (const Domain &other) const |
| int | NumIntervals () const |
| Basic read-only std::vector<> wrapping to view a Domain as a sorted list of non-adjacent intervals. More... | |
| ClosedInterval | front () const |
| ClosedInterval | back () const |
| ClosedInterval | operator[] (int i) const |
| absl::InlinedVector< ClosedInterval, 1 >::const_iterator | begin () const |
| absl::InlinedVector< ClosedInterval, 1 >::const_iterator | end () const |
| std::vector< ClosedInterval > | intervals () const |
Static Public Member Functions | |
| static Domain | AllValues () |
| Returns the full domain Int64. More... | |
| static Domain | FromValues (std::vector< int64 > values) |
| Creates a domain from the union of an unsorted list of integer values. More... | |
| static Domain | FromIntervals (absl::Span< const ClosedInterval > intervals) |
| Creates a domain from the union of an unsorted list of intervals. More... | |
| static Domain | FromVectorIntervals (const std::vector< std::vector< int64 > > &intervals) |
| This method is available in Python, Java and .NET. More... | |
| static Domain | FromFlatIntervals (const std::vector< int64 > &flat_intervals) |
| This method is available in Python, Java and .NET. More... | |
|
inline |
By default, Domain will be empty.
Definition at line 73 of file sorted_interval_list.h.
|
explicit |
Constructor for the common case of a singleton domain.
| operations_research::Domain::Domain | ( | int64 | left, |
| int64 | right | ||
| ) |
Constructor for the common case of a single interval [left, right].
If left > right, this will result in the empty domain.
Returns {x ∈ Int64, ∃ a ∈ D, ∃ b ∈ domain, x = a + b}.
|
static |
Returns the full domain Int64.
|
inline |
Definition at line 244 of file sorted_interval_list.h.
|
inline |
Definition at line 246 of file sorted_interval_list.h.
| Domain operations_research::Domain::Complement | ( | ) | const |
Returns the set Int64 ∖ D.
| bool operations_research::Domain::Contains | ( | int64 | value | ) | const |
Returns true iff value is in Domain.
| Domain operations_research::Domain::ContinuousMultiplicationBy | ( | int64 | coeff | ) | const |
Returns a super-set of MultiplicationBy() to avoid the explosion in the representation size.
This behaves as if we replace the set D of non-adjacent integer intervals by the set of floating-point element in the same intervals.For instance, [1, 100] * 2 will be transformed in [2, 200] and not in [2][4][6]...[200] like in MultiplicationBy(). Note that this would be similar to a InverseDivisionBy(), but not quite the same because if we look for {x ∈ Int64, ∃ e ∈ D, x / coeff = e}, then we will get [2, 201] in the case above.
Returns a super-set of MultiplicationBy() to avoid the explosion in the representation size.
This behaves as if we replace the set D of non-adjacent integer intervals by the set of floating-point element in the same intervals.For instance, [1, 100] * 2 will be transformed in [2, 200] and not in [2][4][6]...[200] like in MultiplicationBy(). Note that this would be similar to a InverseDivisionBy(), but not quite the same because if we look for {x ∈ Int64, ∃ e ∈ D, x / coeff = e}, then we will get [2, 201] in the case above.
| Domain operations_research::Domain::DivisionBy | ( | int64 | coeff | ) | const |
Returns {x ∈ Int64, ∃ e ∈ D, x = e / coeff}.
For instance Domain(1, 7).DivisionBy(2) == Domain(0, 3).
|
inline |
Definition at line 249 of file sorted_interval_list.h.
| std::vector<int64> operations_research::Domain::FlattenedIntervals | ( | ) | const |
This method returns the flattened list of interval bounds of the domain.
Thus the domain {0, 1, 2, 5, 8, 9, 10} will return 0, 2, 5, 5, 8, 10.
|
static |
This method is available in Python, Java and .NET.
It allows building a Domain object from a flattened list of intervals (long[] in Java and .NET, [0, 2, 5, 5, 8, 10] in python).
|
static |
Creates a domain from the union of an unsorted list of intervals.
|
static |
Creates a domain from the union of an unsorted list of integer values.
Input values may be repeated, with no consequence on the output
|
static |
This method is available in Python, Java and .NET.
It allows building a Domain object from a list of intervals (long[][] in Java and .NET, [[0, 2], [5, 5], [8, 10]] in python).
|
inline |
Definition at line 243 of file sorted_interval_list.h.
Returns the set D ∩ domain.
|
inline |
Definition at line 258 of file sorted_interval_list.h.
| Domain operations_research::Domain::InverseMultiplicationBy | ( | const int64 | coeff | ) | const |
Returns {x ∈ Int64, ∃ e ∈ D, x * coeff = e}.
For instance Domain(1, 7).InverseMultiplicationBy(2) == Domain(1, 3).
| bool operations_research::Domain::IsEmpty | ( | ) | const |
Returns true if this is the empty set.
| bool operations_research::Domain::IsIncludedIn | ( | const Domain & | domain | ) | const |
Returns true iff D is included in the given domain.
| int64 operations_research::Domain::Max | ( | ) | const |
Returns the domain max value.
It checks that the domain is not empty.
| int64 operations_research::Domain::Min | ( | ) | const |
Returns the domain min value.
It checks that the domain is not empty.
| Domain operations_research::Domain::MultiplicationBy | ( | int64 | coeff, |
| bool * | exact = nullptr |
||
| ) | const |
Returns {x ∈ Int64, ∃ e ∈ D, x = e * coeff}.
| Domain operations_research::Domain::Negation | ( | ) | const |
Returns {x ∈ Int64, ∃ e ∈ D, x = -e}.
Note in particular that if the negation of Int64 is not Int64 but Int64 \ {kint64min} !!
|
inline |
Basic read-only std::vector<> wrapping to view a Domain as a sorted list of non-adjacent intervals.
Note that we don't expose size() which might be confused with the number of values in the domain.
Definition at line 241 of file sorted_interval_list.h.
|
inline |
Definition at line 233 of file sorted_interval_list.h.
| bool operations_research::Domain::operator< | ( | const Domain & | other | ) | const |
Lexicographic order on the intervals() representation.
|
inline |
Definition at line 229 of file sorted_interval_list.h.
|
inline |
Definition at line 245 of file sorted_interval_list.h.
| Domain operations_research::Domain::RelaxIfTooComplex | ( | ) | const |
If NumIntervals() is too large, this return a superset of the domain.
| Domain operations_research::Domain::SimplifyUsingImpliedDomain | ( | const Domain & | implied_domain | ) | const |
Advanced usage.
Given some "implied" information on this domain that is assumed to be always true (i.e. only values in the intersection with implied domain matter), this function will simplify the current domain without changing the set of "possible values".More precisely, this will:
| int64 operations_research::Domain::Size | ( | ) | const |
Returns the number of elements in the domain. It is capped at kint64max.
| std::string operations_research::Domain::ToString | ( | ) | const |
Returns a compact std::string of a vector of intervals like "[1,4][6][10,20]".
Returns the set D ∪ domain.