Class: Gecode::Set::SetConstraintReceiver
- Inherits:
-
ConstraintReceiver
- Object
- ConstraintReceiver
- Gecode::Set::SetConstraintReceiver
- Defined in:
- lib/gecoder/interface/constraints/set_var_constraints.rb,
lib/gecoder/interface/constraints/set/domain.rb,
lib/gecoder/interface/constraints/set/channel.rb,
lib/gecoder/interface/constraints/set/include.rb,
lib/gecoder/interface/constraints/set/relation.rb
Overview
SetConstraintReceiver contains all constraints that can be placed on a SetOperand.
Constraints are placed by calling SetOperand#must (or any other of the variations defined in Operand), which produces a SetConstraintReceiver from which the desired constraint can be used.
Most constraint accept :reify option. See ConstraintReceiver for more information.
Examples
Constrains set_operand to be a subset of 1, 2 using
an alias of SetConstraintReceiver#subset:
set_operand.must_be.subset_of 0..2
Constrains the union of set_operand1 and set_operand2 to a
subset of 1, 2 using the SetOperand#union property and
SetConstraintReceiver#subset:
set_operand1.union(set_operand2).must_be.subset_of 0..2
Constrains the union of the set operands in set_enum to not
equal 1, 2 by using the SetEnumOperand#union property and
an alias of SetConstraintReceiver#==:
set_enum.union.must_not == 0..2
The same as above, but alsa specifying that the constraint should be
reified with bool_operand:
set_enum.union.must_not.equal(0..2, :reify => bool_operand)
Instance Method Summary collapse
-
#==(set_operand, options = {}) ⇒ Object
Constrains the set operand to equal
set_operand. -
#channel(bool_enum, options = {}) ⇒ Object
Constrains this set to channel
bool_enum. -
#complement(set_operand, options = {}) ⇒ Object
Constrains the set operand to be the complement of
set_operand. -
#disjoint(set_operand, options = {}) ⇒ Object
Constrains the set operand to be disjoint with
set_operand. -
#include(int_enum) ⇒ Object
Constrains this set to include the values of
int_enum. -
#initialize(model, params) ⇒ SetConstraintReceiver
constructor
Raises TypeError unless the left hand side is a set operand.
-
#pre_relation_complement ⇒ Object
Constrains the set operand to be the complement of
constant_set. -
#pre_relation_disjoint ⇒ Object
Constrains the set operand to be disjoint with
constant_set. -
#pre_relation_equality ⇒ Object
Constrains the set operand to have a domain equal to
constant_set. -
#pre_relation_subset ⇒ Object
Constrains the set operand to be a subset of
constant_set. -
#pre_relation_superset ⇒ Object
Constrains the set operand to be a superset of
constant_set. -
#subset(set_operand, options = {}) ⇒ Object
Constrains the set operand to be a subeset of
set_operand. -
#superset(set_operand, options = {}) ⇒ Object
Constrains the set operand to be a superset of
set_operand.
Constructor Details
#initialize(model, params) ⇒ SetConstraintReceiver
Raises TypeError unless the left hand side is a set operand.
210 211 212 213 214 215 216 |
# File 'lib/gecoder/interface/constraints/set_var_constraints.rb', line 210 def initialize(model, params) #:nodoc: super unless params[:lhs].respond_to? :to_set_var raise TypeError, 'Must have set operand as left hand side.' end end |
Instance Method Details
#==(set_operand, options = {}) ⇒ Object
Constrains the set operand to equal set_operand.
Examples
set1 must equal set2
set1.must == set2
set1 must equal set2. Reify the constraint with the
boolean operand bool.
set1.must.equal(set2, :reify => bool)
16 17 18 |
# File 'lib/gecoder/interface/constraints/set/domain.rb', line 16 def ==(constant_set, = {}) add_domain_constraint(:==, constant_set, ) end |
#channel(bool_enum, options = {}) ⇒ Object
Constrains this set to channel bool_enum. The set is constrained
to include value i exactly when the operand at index i in the
boolean enumeration is true.
Neither reification nor negation is supported. The boolean enum and set can be interchanged.
Examples
Constrains the enumeration of boolean operands called bools to at
least have the first and third operands set to true
set.must_be.superset_of [0, 2] set.must.channel bools
An alternative way of writing the above.
set.must_be.superset_of [0, 2] bools.must.channel set
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/gecoder/interface/constraints/set/channel.rb', line 20 def channel(bool_enum, = {}) if @params[:negate] raise Gecode::MissingConstraintError, 'A negated channel constraint ' + 'is not implemented.' end if .has_key? :reify raise ArgumentError, 'The channel constraint does not support the ' + 'reification option.' end unless bool_enum.respond_to? :to_bool_enum raise TypeError, 'Expected an enum of bool operands, ' + "got #{bool_enum.class}." end @params.update(:rhs => bool_enum) @params.update Gecode::Set::Util.() @model.add_constraint Channel::ChannelConstraint.new(@model, @params) end |
#complement(set_operand, options = {}) ⇒ Object
Constrains the set operand to be the complement of set_operand.
Examples
set1 must be the complement of set2
set1.must_be.complement_of set2
set1 must be the complement of set2. Reify the constraint
with the boolean operand bool.
set1.must_be.complement(set2, :reify => bool)
96 97 98 |
# File 'lib/gecoder/interface/constraints/set/domain.rb', line 96 def complement(constant_set, = {}) add_domain_constraint(:complement, constant_set, ) end |
#disjoint(set_operand, options = {}) ⇒ Object
Constrains the set operand to be disjoint with set_operand.
Examples
set1 must be disjoint with set2
set1.must_be.disjoint_with set2
set1 must be disjoint with set2. Reify the constraint
with the boolean operand bool.
set1.must_be.disjoint(set2, :reify => bool)
76 77 78 |
# File 'lib/gecoder/interface/constraints/set/domain.rb', line 76 def disjoint(constant_set, = {}) add_domain_constraint(:disjoint, constant_set, ) end |
#include(int_enum) ⇒ Object
Constrains this set to include the values of int_enum.
The constraint has the side effect of sorting the integer operands in a non-descending order. It does not support reification nor negation.
Examples
Constrain set to include the values of all operands in
int_enum.
set.must.include int_enum
13 14 15 16 17 18 19 20 21 22 23 24 |
# File 'lib/gecoder/interface/constraints/set/include.rb', line 13 def include(int_enum) unless int_enum.respond_to? :to_int_enum raise TypeError, "Expected int var enum, got #{int_enum.class}." end if @params[:negate] raise Gecode::MissingConstraintError, 'A negated include is not ' + 'implemented.' end @params.update(:variables => int_enum) @model.add_constraint Connection::IncludeConstraint.new(@model, @params) end |
#pre_relation_complement ⇒ Object
Constrains the set operand to be the complement of constant_set.
Examples
set must be the complement of [1,2,5]
set.must_be.complement_of [1,2,5]
set must be the complement of 1..67
set.must_be.complement_of 1..67
set must not be the complement of [0].
set.must_not_be.complement_of 0
set must be the complement of [1,3,5,7]. The constraint is
reified with the boolean operand bool.
set.must_be.complement_of([1.3.5.7], :reify => bool)
79 80 81 |
# File 'lib/gecoder/interface/constraints/set/relation.rb', line 79 def complement(constant_set, = {}) add_domain_constraint(:complement, constant_set, ) end |
#pre_relation_disjoint ⇒ Object
Constrains the set operand to be disjoint with constant_set.
Examples
set must be disjoint with [1,2,5]
set.must_be.disjoint_with [1,2,5]
set must be disjoint with 1..67
set.must_be.disjoint_with 1..67
set must not be disjoint with [0].
set.must_not_be.disjoint_with 0
set must be disjoint with [1,3,5,7]. The constraint is reified with
the boolean operand bool.
set.must_be.disjoint_with([1.3.5.7], :reify => bool)
60 61 62 |
# File 'lib/gecoder/interface/constraints/set/relation.rb', line 60 def disjoint(constant_set, = {}) add_domain_constraint(:disjoint, constant_set, ) end |
#pre_relation_equality ⇒ Object
Constrains the set operand to have a domain equal to constant_set.
Examples
set must equal [1,2,5]
set.must == [1,2,5]
set must not equal 1..67
set.must_not == 1..67
set must equal the singleton set 0. The constraint is reified with
the boolean operand is_singleton_zero.
set.must.equal(0, :reify => is_singleton_zero)
3 4 5 |
# File 'lib/gecoder/interface/constraints/set/relation.rb', line 3 def ==(constant_set, = {}) add_domain_constraint(:==, constant_set, ) end |
#pre_relation_subset ⇒ Object
Constrains the set operand to be a subset of constant_set.
Examples
set must be a subset of [1,2,5]
set.must_be.subset_of [1,2,5]
set must be a subset of 1..67
set.must_be.subset_of 1..67
set must not be a subset of [0].
set.must_not_be.subset_of 0
set must be a subset of [1,3,5,7]. The constraint is reified with
the boolean operand bool.
set.must_be.subset_of([1.3.5.7], :reify => bool)
41 42 43 |
# File 'lib/gecoder/interface/constraints/set/relation.rb', line 41 def subset(constant_set, = {}) add_domain_constraint(:subset, constant_set, ) end |
#pre_relation_superset ⇒ Object
Constrains the set operand to be a superset of constant_set.
Examples
set must be a superset of [1,2,5]
set.must_be.superset_of [1,2,5]
set must be a superset of 1..67
set.must_be.superset_of 1..67
set must not be a superset of [0].
set.must_not_be.superset_of 0
set must be a superset of [1,3,5,7]. The constraint is reified with
the boolean operand bool.
set.must_be.superset_of([1.3.5.7], :reify => bool)
22 23 24 |
# File 'lib/gecoder/interface/constraints/set/relation.rb', line 22 def superset(constant_set, = {}) add_domain_constraint(:superset, constant_set, ) end |
#subset(set_operand, options = {}) ⇒ Object
Constrains the set operand to be a subeset of set_operand.
Examples
set1 must be a subset of set2
set1.must_be.subset_of == set2
set1 must be a subset of set2. Reify the constraint
with the boolean operand bool.
set1.must_be.subset(set2, :reify => bool)
56 57 58 |
# File 'lib/gecoder/interface/constraints/set/domain.rb', line 56 def subset(constant_set, = {}) add_domain_constraint(:subset, constant_set, ) end |
#superset(set_operand, options = {}) ⇒ Object
Constrains the set operand to be a superset of set_operand.
Examples
set1 must be a superset of set2
set1.must_be.superset_of set2
set1 must be a superset of set2. Reify the constraint
with the boolean operand bool.
set1.must_be.superset(set2, :reify => bool)
36 37 38 |
# File 'lib/gecoder/interface/constraints/set/domain.rb', line 36 def superset(constant_set, = {}) add_domain_constraint(:superset, constant_set, ) end |