gecoder 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +6 -0
- data/README +1 -1
- data/example/square_tiling.rb +84 -0
- data/example/sudoku-set.rb +107 -0
- data/example/sudoku.rb +2 -6
- data/lib/gecoder/bindings.rb +1 -1
- data/lib/gecoder/bindings/bindings.rb +20 -0
- data/lib/gecoder/interface/binding_changes.rb +2 -2
- data/lib/gecoder/interface/branch.rb +50 -51
- data/lib/gecoder/interface/constraints.rb +10 -10
- data/lib/gecoder/interface/constraints/bool/boolean.rb +79 -5
- data/lib/gecoder/interface/constraints/bool/linear.rb +29 -0
- data/lib/gecoder/interface/constraints/bool_enum/boolean.rb +34 -4
- data/lib/gecoder/interface/constraints/bool_var_constraints.rb +14 -9
- data/lib/gecoder/interface/constraints/int/arithmetic.rb +26 -8
- data/lib/gecoder/interface/constraints/int/domain.rb +30 -3
- data/lib/gecoder/interface/constraints/int/linear.rb +82 -16
- data/lib/gecoder/interface/constraints/int_enum/arithmetic.rb +31 -3
- data/lib/gecoder/interface/constraints/int_enum/channel.rb +63 -3
- data/lib/gecoder/interface/constraints/int_enum/count.rb +20 -3
- data/lib/gecoder/interface/constraints/int_enum/distinct.rb +22 -2
- data/lib/gecoder/interface/constraints/int_enum/element.rb +23 -4
- data/lib/gecoder/interface/constraints/int_enum/equality.rb +9 -2
- data/lib/gecoder/interface/constraints/int_enum/sort.rb +28 -3
- data/lib/gecoder/interface/constraints/int_enum_constraints.rb +1 -1
- data/lib/gecoder/interface/constraints/int_var_constraints.rb +13 -8
- data/lib/gecoder/interface/constraints/set/cardinality.rb +27 -8
- data/lib/gecoder/interface/constraints/set/connection.rb +72 -6
- data/lib/gecoder/interface/constraints/set/domain.rb +46 -3
- data/lib/gecoder/interface/constraints/set/operation.rb +35 -4
- data/lib/gecoder/interface/constraints/set/relation.rb +59 -6
- data/lib/gecoder/interface/constraints/set_enum/distinct.rb +22 -3
- data/lib/gecoder/interface/constraints/set_enum/operation.rb +26 -2
- data/lib/gecoder/interface/constraints/set_enum/selection.rb +110 -36
- data/lib/gecoder/interface/constraints/set_var_constraints.rb +11 -7
- data/lib/gecoder/interface/model.rb +6 -6
- data/lib/gecoder/interface/search.rb +6 -6
- data/lib/gecoder/interface/variables.rb +56 -12
- data/lib/gecoder/version.rb +1 -1
- data/specs/constraints/linear.rb +167 -1
- data/specs/constraints/set_domain.rb +6 -0
- data/tasks/distribution.rake +25 -3
- data/tasks/website.rake +5 -12
- metadata +10 -4
- data/vendor/rust/configure.rb +0 -6
- data/vendor/rust/out.rb +0 -627
@@ -15,8 +15,22 @@ module Gecode::IntEnumMethods
|
|
15
15
|
end
|
16
16
|
|
17
17
|
# A module that gathers the classes and modules used by arithmetic constraints.
|
18
|
-
module Gecode::Constraints::IntEnum::Arithmetic
|
19
|
-
# Describes
|
18
|
+
module Gecode::Constraints::IntEnum::Arithmetic #:nodoc:
|
19
|
+
# Describes a CompositeStub for the max constraint, which constrains the
|
20
|
+
# maximum value of the integer variables in an enumeration.
|
21
|
+
#
|
22
|
+
# == Example
|
23
|
+
#
|
24
|
+
# # The maximum must be positive.
|
25
|
+
# int_enum.max.must > 0
|
26
|
+
#
|
27
|
+
# # The maximum must equal a integer variable +max+.
|
28
|
+
# int_enum.max.must == max
|
29
|
+
#
|
30
|
+
# # The maximum must not be negative. The constraint is reified with the
|
31
|
+
# # boolean variable +is_negative+ and strength +domain+ is selected.
|
32
|
+
# int_enum.max.must_not_be.less_than(0, :reify => is_negative,
|
33
|
+
# :strength => :domain)
|
20
34
|
class MaxExpressionStub < Gecode::Constraints::Int::CompositeStub
|
21
35
|
def constrain_equal(variable, params, constrain)
|
22
36
|
enum, strength = @params.values_at(:lhs, :strength)
|
@@ -29,7 +43,21 @@ module Gecode::Constraints::IntEnum::Arithmetic
|
|
29
43
|
end
|
30
44
|
end
|
31
45
|
|
32
|
-
# Describes
|
46
|
+
# Describes a CompositeStub for the min constraint, which constrains the
|
47
|
+
# minimum value of the integer variables in an enumeration.
|
48
|
+
#
|
49
|
+
# == Example
|
50
|
+
#
|
51
|
+
# # The minimum must be positive.
|
52
|
+
# int_enum.min.must > 0
|
53
|
+
#
|
54
|
+
# # The minimum must equal a integer variable +min+.
|
55
|
+
# int_enum.min.must == min
|
56
|
+
#
|
57
|
+
# # The minimum must not be non-positive. The constraint is reified with the
|
58
|
+
# # boolean variable +is_positive+ and strength +domain+ is selected.
|
59
|
+
# int_enum.min.must_not_be.less_or_equal(0, :reify => is_positive,
|
60
|
+
# :strength => :domain)
|
33
61
|
class MinExpressionStub < Gecode::Constraints::Int::CompositeStub
|
34
62
|
def constrain_equal(variable, params, constrain)
|
35
63
|
enum, strength = @params.values_at(:lhs, :strength)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Gecode::Constraints::IntEnum
|
2
2
|
class Expression
|
3
|
-
#
|
3
|
+
# Adds a channel constraint on the variables in the enum with the specified
|
4
4
|
# other set or int enum.
|
5
5
|
def channel(enum, options = {})
|
6
6
|
if @params[:negate]
|
@@ -19,8 +19,68 @@ module Gecode::Constraints::IntEnum
|
|
19
19
|
end
|
20
20
|
|
21
21
|
# A module that gathers the classes and modules used in channel constraints.
|
22
|
-
module Channel
|
23
|
-
# Describes a channel constraint
|
22
|
+
module Channel #:nodoc:
|
23
|
+
# Describes a channel constraint which "channels" two enumerations of
|
24
|
+
# integer variables or one enumeration of integer variables and one
|
25
|
+
# enumeration of set variables. Channel constraints are used to give
|
26
|
+
# access to multiple viewpoints when modelling.
|
27
|
+
#
|
28
|
+
# When used on two integer enumeration, the channel constraint can be
|
29
|
+
# thought of as constraining the arrays to be each other's inverses. When
|
30
|
+
# used with an enumeration of sets the i:th set includes the value of the
|
31
|
+
# j:th integer.
|
32
|
+
#
|
33
|
+
# Neither reification nor negation is supported. Selecting strength is only
|
34
|
+
# supported when using the constraint between two integer enumerations,
|
35
|
+
# it's not supported when a set enumeration is used.
|
36
|
+
#
|
37
|
+
# == Example
|
38
|
+
#
|
39
|
+
# Lets say that we’re modelling a sequence of numbers that must be distinct
|
40
|
+
# and that we want access to the following two view simultaneously.
|
41
|
+
#
|
42
|
+
# === First view
|
43
|
+
#
|
44
|
+
# The sequence is modelled as an array of integer variables where the first
|
45
|
+
# variable holds the value of the first position in the sequence, the
|
46
|
+
# second the value of the second position and so on.
|
47
|
+
#
|
48
|
+
# # n variables with values from 0 to n-1.
|
49
|
+
# elements = int_var_array(n, 0...n)
|
50
|
+
# elements.must_be.distinct
|
51
|
+
#
|
52
|
+
# That way +elements+ will contain the actual sequence when the problem has
|
53
|
+
# been solved.
|
54
|
+
#
|
55
|
+
# === Second view
|
56
|
+
#
|
57
|
+
# The sequence is modelled as the positions of each value in 0..(n-1) in
|
58
|
+
# the sequence. That way the first variable would hold the positions of 0
|
59
|
+
# in the sequence, the second variable would hold the positions of 1 in the
|
60
|
+
# sequence and so on.
|
61
|
+
#
|
62
|
+
# positions = int_var_array(n, 0...n)
|
63
|
+
# positions.must_be.distinct
|
64
|
+
#
|
65
|
+
# === Connecting the views
|
66
|
+
#
|
67
|
+
# In essence the relationship between the two arrays +elements+ and
|
68
|
+
# +positions+ is that
|
69
|
+
#
|
70
|
+
# elements.map{ |e| e.val }[i] == positions.map{ |p| p.val }.index(i)
|
71
|
+
#
|
72
|
+
# for all i in 0..(n-1). This relationship is enforced by the channel
|
73
|
+
# constraint as follows.
|
74
|
+
#
|
75
|
+
# elements.must.channel positions
|
76
|
+
#
|
77
|
+
# == Example (sets)
|
78
|
+
#
|
79
|
+
# # +set_enum+ is constrained to channel +int_enum+.
|
80
|
+
# int_enum.must.channel set_enum
|
81
|
+
#
|
82
|
+
# # This is another way of saying the above.
|
83
|
+
# set_enum.must.channel int_enum
|
24
84
|
class ChannelConstraint < Gecode::Constraints::Constraint
|
25
85
|
def post
|
26
86
|
lhs, rhs, strength = @params.values_at(:lhs, :rhs, :strength)
|
@@ -16,9 +16,9 @@ module Gecode
|
|
16
16
|
end
|
17
17
|
|
18
18
|
# A module that gathers the classes and modules used in count constraints.
|
19
|
-
module Gecode::Constraints::IntEnum::Count
|
19
|
+
module Gecode::Constraints::IntEnum::Count #:nodoc:
|
20
20
|
# Describes an expression
|
21
|
-
class Expression < Gecode::Constraints::IntEnum::Expression
|
21
|
+
class Expression < Gecode::Constraints::IntEnum::Expression #:nodoc:
|
22
22
|
def initialize(model, params)
|
23
23
|
super
|
24
24
|
unless params[:negate]
|
@@ -47,7 +47,24 @@ module Gecode::Constraints::IntEnum::Count
|
|
47
47
|
alias_comparison_methods
|
48
48
|
end
|
49
49
|
|
50
|
-
# Describes a count constraint
|
50
|
+
# Describes a count constraint, which constrains the number of times a value
|
51
|
+
# (constant or a variable) may occurr in an enumeration of integer variable.
|
52
|
+
#
|
53
|
+
# All relations available for +SimpleRelationConstraint+ can be used with
|
54
|
+
# count constraints. Negation and reification is supported.
|
55
|
+
#
|
56
|
+
# == Examples
|
57
|
+
#
|
58
|
+
# # Constrain +int_enum+ to not contain 0 exactly once.
|
59
|
+
# int_enum.count(0).must_not == 1
|
60
|
+
#
|
61
|
+
# # Constrain +int_enum+ to contain +x+ exactly +x_count+ times.
|
62
|
+
# int_enum.count(x).must == x_count
|
63
|
+
#
|
64
|
+
# # Reifies the constraint that +int_enum+ has +x+ zeros with the boolean
|
65
|
+
# # variable +has_x_zeros+ and selects the strength +domain+.
|
66
|
+
# int_enum.count(0).must.equal(x, :reify => has_x_zeros,
|
67
|
+
# :strength => :domain)
|
51
68
|
class CountConstraint < Gecode::Constraints::ReifiableConstraint
|
52
69
|
def post
|
53
70
|
lhs, element, relation_type, rhs, strength, reif_var =
|
@@ -32,8 +32,28 @@ module Gecode::Constraints::IntEnum
|
|
32
32
|
end
|
33
33
|
|
34
34
|
# A module that gathers the classes and modules used in distinct constraints.
|
35
|
-
module Distinct
|
36
|
-
# Describes a distinct constraint
|
35
|
+
module Distinct #:nodoc:
|
36
|
+
# Describes a distinct constraint, which constrains all integer variables
|
37
|
+
# in an enumeration to be distinct (different). The constraint can also be
|
38
|
+
# used with constant offsets, so that the variables, with specified offsets
|
39
|
+
# added, must be distinct.
|
40
|
+
#
|
41
|
+
# The constraint does not support negation nor reification.
|
42
|
+
#
|
43
|
+
# == Examples
|
44
|
+
#
|
45
|
+
# # Constrains all variables in +int_enum+ to be assigned different
|
46
|
+
# # values.
|
47
|
+
# int_enum.must_be.distinct
|
48
|
+
#
|
49
|
+
# # The same as above, but also selects that the strength +domain+ should
|
50
|
+
# # be used.
|
51
|
+
# int_enum.must_be.distinct(:strength => :domain)
|
52
|
+
#
|
53
|
+
# # Uses the offset to constrain that no number may be the previous number
|
54
|
+
# # incremented by one.
|
55
|
+
# numbers = int_var_array(8, 0..9)
|
56
|
+
# numbers.with_offset((1..numbers.size).to_a.reverse).must_be.distinct
|
37
57
|
class DistinctConstraint < Gecode::Constraints::Constraint
|
38
58
|
def post
|
39
59
|
# Bind lhs.
|
@@ -1,7 +1,26 @@
|
|
1
1
|
# A module that gathers the classes and modules used by element constraints.
|
2
|
-
module Gecode::Constraints::IntEnum::Element
|
3
|
-
# Describes
|
4
|
-
#
|
2
|
+
module Gecode::Constraints::IntEnum::Element #:nodoc:
|
3
|
+
# Describes a CompositeStub for the element constraint, which places a
|
4
|
+
# constraint on a variable at the specified position in an enumeration of
|
5
|
+
# integer variables. It's basically the array access of constraint
|
6
|
+
# programming.
|
7
|
+
#
|
8
|
+
# == Example
|
9
|
+
#
|
10
|
+
# # The variable at the +x+:th position in +int_enum+ must be larger than
|
11
|
+
# # +y+.
|
12
|
+
# int_enum[x].must > y
|
13
|
+
#
|
14
|
+
# # The price of +selected_item+ as described by +prices+ must not be
|
15
|
+
# # larger than 100.
|
16
|
+
# prices = wrap_enum([500, 24, 4711, 412, 24])
|
17
|
+
# prices[selected_item].must_not > 100
|
18
|
+
#
|
19
|
+
# # Reify the constraint that the +x+:th variable in +int_enum+ must be in
|
20
|
+
# # range 7..17 with the boolean variable +bool+ and select strength
|
21
|
+
# # +domain+.
|
22
|
+
#
|
23
|
+
# int_enum[x].must_be.in(7..17, :reify => bool, :strength => :domain)
|
5
24
|
class ExpressionStub < Gecode::Constraints::Int::CompositeStub
|
6
25
|
def constrain_equal(variable, params, constrain)
|
7
26
|
enum, position, strength = @params.values_at(:lhs, :position, :strength)
|
@@ -17,7 +36,7 @@ module Gecode::Constraints::IntEnum::Element
|
|
17
36
|
end
|
18
37
|
|
19
38
|
# Methods needed to add support for element constraints to enums.
|
20
|
-
module AdditionalEnumMethods
|
39
|
+
module AdditionalEnumMethods #:nodoc:
|
21
40
|
# This adds the adder for the methods in the modules including it. The
|
22
41
|
# reason for doing it so indirect is that the first #[] won't be defined
|
23
42
|
# before the module that this is mixed into is mixed into an enum.
|
@@ -15,8 +15,15 @@ module Gecode::Constraints::IntEnum
|
|
15
15
|
end
|
16
16
|
|
17
17
|
# A module that gathers the classes and modules used in equality constraints.
|
18
|
-
module Equality
|
19
|
-
# Describes an equality constraint
|
18
|
+
module Equality #:nodoc:
|
19
|
+
# Describes an equality constraint, which constrains all variables in an
|
20
|
+
# integer enumeration to be equal. Neither negation nor reification is
|
21
|
+
# supported.
|
22
|
+
#
|
23
|
+
# == Example
|
24
|
+
#
|
25
|
+
# # Constrains all variables in +int_enum+ to be equal.
|
26
|
+
# int_enum.must_be.equal
|
20
27
|
class EqualityConstraint < Gecode::Constraints::Constraint
|
21
28
|
def post
|
22
29
|
# Bind lhs.
|
@@ -47,8 +47,22 @@ module Gecode::Constraints::IntEnum
|
|
47
47
|
end
|
48
48
|
|
49
49
|
# A module that gathers the classes and modules used in sort constraints.
|
50
|
-
module Sort
|
51
|
-
# Describes a sort constraint
|
50
|
+
module Sort #:nodoc:
|
51
|
+
# Describes a sort constraint which constrains a target enumeration of
|
52
|
+
# integer variables to be the sorted version of another set of integer
|
53
|
+
# variables. Optionally a third enumeration may be used to define the order
|
54
|
+
# in which the the variables should be sorted.
|
55
|
+
#
|
56
|
+
# Neither negation nor reification is supported.
|
57
|
+
#
|
58
|
+
# == Example
|
59
|
+
#
|
60
|
+
# # Constrains +sorted_numbers+ to be a sorted version of +numbers+.
|
61
|
+
# numbers.must_be.sorted(:as => sorted_numbers)
|
62
|
+
#
|
63
|
+
# # Constrains +sorted_numbers+ to be +numbers+ sorted in the order
|
64
|
+
# # described by the integer variable enumeration +order+.
|
65
|
+
# numbers.must_be.sorted(:as => sorted_numbers, :order => order)
|
52
66
|
class SortConstraintWithOptions < Gecode::Constraints::Constraint
|
53
67
|
def post
|
54
68
|
if @params[:target].nil?
|
@@ -70,7 +84,18 @@ module Gecode::Constraints::IntEnum
|
|
70
84
|
end
|
71
85
|
end
|
72
86
|
|
73
|
-
# Describes a sort constraint
|
87
|
+
# Describes a sort constraint which constrains an enumeration of integer
|
88
|
+
# variables to be sorted. Supports reification and negation.
|
89
|
+
#
|
90
|
+
# == Example
|
91
|
+
#
|
92
|
+
# # Constrains the variables in +int_enum+ to be sorted ascendingly.
|
93
|
+
# int_enum.must_be.sorted
|
94
|
+
#
|
95
|
+
# # Reifies the constraint that the variables in +int_enum+ to be sorted
|
96
|
+
# # ascendingly with the boolean variable +is_sorted+, while selecting
|
97
|
+
# # +domain+ as strength.
|
98
|
+
# int_enum.must_be.sorted(:reify => :is_sorted, :strength => :domain)
|
74
99
|
class SortConstraint < Gecode::Constraints::ReifiableConstraint
|
75
100
|
def post
|
76
101
|
lhs, strength, reif_var = @params.values_at(:lhs, :strength, :reif)
|
@@ -15,7 +15,7 @@ module Gecode
|
|
15
15
|
# variables as left hand side.
|
16
16
|
module Constraints::IntEnum
|
17
17
|
# Expressions with int enums as left hand sides.
|
18
|
-
class Expression < Gecode::Constraints::Expression
|
18
|
+
class Expression < Gecode::Constraints::Expression #:nodoc:
|
19
19
|
# Raises TypeError unless the left hand side is an int enum.
|
20
20
|
def initialize(model, params)
|
21
21
|
super
|
@@ -14,12 +14,13 @@ module Gecode
|
|
14
14
|
# A module containing constraints that have int variables as left hand side
|
15
15
|
# (but not enumerations).
|
16
16
|
module Constraints::Int
|
17
|
-
|
17
|
+
# Describes an integer expression.
|
18
|
+
class Expression < Gecode::Constraints::Expression #:nodoc:
|
18
19
|
end
|
19
20
|
|
20
21
|
# A composite expression which is an int expression with a left hand side
|
21
22
|
# resulting from a previous constraint.
|
22
|
-
class CompositeExpression < Gecode::Constraints::CompositeExpression
|
23
|
+
class CompositeExpression < Gecode::Constraints::CompositeExpression #:nodoc:
|
23
24
|
# The block given should take three parameters. The first is the variable
|
24
25
|
# that should be the left hand side, if it's nil then a new one should be
|
25
26
|
# created. The second is the has of parameters. The block should return
|
@@ -30,16 +31,20 @@ module Gecode
|
|
30
31
|
end
|
31
32
|
end
|
32
33
|
|
33
|
-
# Describes a stub that produces an int variable, which can then be used
|
34
|
-
# the normal int variable constraints. An example would be the element
|
34
|
+
# Describes a stub that produces an int variable, which can then be used
|
35
|
+
# with the normal int variable constraints. An example would be the element
|
35
36
|
# constraint.
|
36
37
|
#
|
37
38
|
# int_enum[int_var].must > rhs
|
38
39
|
#
|
39
|
-
#
|
40
|
-
#
|
41
|
-
# one temporary variable) are required, but in the case of
|
42
|
-
# one constraint is required.
|
40
|
+
# <tt>int_enum[int_var]</tt> produces an int variable which the constraint
|
41
|
+
# <tt>.must > rhs</tt> is then applied to. In the above case two
|
42
|
+
# constraints (and one temporary variable) are required, but in the case of
|
43
|
+
# equality only one constraint is required.
|
44
|
+
#
|
45
|
+
# Whether a constraint involving a reification stub supports negation,
|
46
|
+
# reification, strength options and so on depends on the constraint on the
|
47
|
+
# right hand side.
|
43
48
|
class CompositeStub < Gecode::Constraints::CompositeStub
|
44
49
|
def initialize(model, params)
|
45
50
|
super(CompositeExpression, model, params)
|
@@ -3,7 +3,8 @@ module Gecode
|
|
3
3
|
# Starts a constraint on the size of the set.
|
4
4
|
def size
|
5
5
|
params = {:lhs => self}
|
6
|
-
Gecode::Constraints::Set::Cardinality::SizeExpressionStub.new(
|
6
|
+
Gecode::Constraints::Set::Cardinality::SizeExpressionStub.new(
|
7
|
+
@model, params)
|
7
8
|
end
|
8
9
|
end
|
9
10
|
end
|
@@ -11,9 +12,11 @@ end
|
|
11
12
|
module Gecode::Constraints::Set
|
12
13
|
# A module that gathers the classes and modules used in cardinality
|
13
14
|
# constraints.
|
14
|
-
module Cardinality
|
15
|
-
# Describes a cardinality constraint.
|
16
|
-
|
15
|
+
module Cardinality #:nodoc:
|
16
|
+
# Describes a cardinality constraint specifically for ranges. This is just
|
17
|
+
# a special case which is used instead of the more general composite
|
18
|
+
# constraint when the target cardinality is a range.
|
19
|
+
class CardinalityConstraint < Gecode::Constraints::Constraint #:nodoc:
|
17
20
|
def post
|
18
21
|
var, range = @params.values_at(:lhs, :range)
|
19
22
|
Gecode::Raw::cardinality(@model.active_space, var.bind, range.first,
|
@@ -22,14 +25,14 @@ module Gecode::Constraints::Set
|
|
22
25
|
end
|
23
26
|
|
24
27
|
# A custom composite stub to change the composite expression used.
|
25
|
-
class CompositeStub < Gecode::Constraints::CompositeStub
|
28
|
+
class CompositeStub < Gecode::Constraints::CompositeStub #:nodoc:
|
26
29
|
def initialize(model, params)
|
27
30
|
super(Expression, model, params)
|
28
31
|
end
|
29
32
|
end
|
30
33
|
|
31
34
|
# Describes a cardinality expression started with set.size.must .
|
32
|
-
class Expression < Gecode::Constraints::Int::CompositeExpression
|
35
|
+
class Expression < Gecode::Constraints::Int::CompositeExpression #:nodoc:
|
33
36
|
def in(range)
|
34
37
|
if range.kind_of?(Range) and !@params[:negate]
|
35
38
|
@params.update(:range => range)
|
@@ -40,8 +43,24 @@ module Gecode::Constraints::Set
|
|
40
43
|
end
|
41
44
|
end
|
42
45
|
|
43
|
-
# Describes
|
44
|
-
#
|
46
|
+
# Describes a CompositeStub for the cardianlity constraint which constrains
|
47
|
+
# the cardianlity (size) of a set.
|
48
|
+
#
|
49
|
+
# == Example
|
50
|
+
#
|
51
|
+
# # The size of +set+ must be within 1..17
|
52
|
+
# set.size.must_be.in 1..17
|
53
|
+
#
|
54
|
+
# # The size must equal the integer variable +size+.
|
55
|
+
# set.size.must == size
|
56
|
+
#
|
57
|
+
# # The size must not be larger than 17
|
58
|
+
# set.size.must_not > 17
|
59
|
+
#
|
60
|
+
# # We reify the above with a boolean variable called +is_not_large+ and
|
61
|
+
# # select the strength +domain+.
|
62
|
+
# set.size.must_not_be.larger_than(17, :reify => is_not_large,
|
63
|
+
# :strength => :domain)
|
45
64
|
class SizeExpressionStub < CompositeStub
|
46
65
|
def constrain_equal(variable, params, constrain)
|
47
66
|
lhs = @params[:lhs]
|
@@ -68,8 +68,27 @@ module Gecode::Constraints::Set
|
|
68
68
|
|
69
69
|
# A module that gathers the classes and modules used in connection
|
70
70
|
# constraints.
|
71
|
-
module Connection
|
72
|
-
# Describes
|
71
|
+
module Connection #:nodoc:
|
72
|
+
# Describes a CompositeStub for the min constraint which constrains the
|
73
|
+
# minimum value of a set variable.
|
74
|
+
#
|
75
|
+
# == Examples
|
76
|
+
#
|
77
|
+
# # Constrains the minimum value of +set+ to be larger than 17.
|
78
|
+
# set.min.must > 17
|
79
|
+
#
|
80
|
+
# # Constrains the minimum value of +set+ to equal the integer variable
|
81
|
+
# # +min+.
|
82
|
+
# set.min.must == min
|
83
|
+
#
|
84
|
+
# # Constrains the minimum value of +set+ to not be larger than the
|
85
|
+
# # integer variable +ceil+.
|
86
|
+
# set.min.must_not > ceil
|
87
|
+
#
|
88
|
+
# # The same as above but reified with the boolean variable
|
89
|
+
# # +is_not_above_ceiling+ and with the strength +domain+ applied.
|
90
|
+
# set.min.must_not_be.larger_than(ceil, :reify => :is_not_above_ceiling,
|
91
|
+
# :strength => :domain)
|
73
92
|
class MinExpressionStub < Gecode::Constraints::Int::CompositeStub
|
74
93
|
def constrain_equal(variable, params, constrain)
|
75
94
|
set = params[:lhs]
|
@@ -81,7 +100,26 @@ module Gecode::Constraints::Set
|
|
81
100
|
end
|
82
101
|
end
|
83
102
|
|
84
|
-
# Describes
|
103
|
+
# Describes a CompositeStub for the max constraint which constrains the
|
104
|
+
# maximum value of a set variable.
|
105
|
+
#
|
106
|
+
# == Examples
|
107
|
+
#
|
108
|
+
# # Constrains the maximum value of +set+ to be larger than 17.
|
109
|
+
# set.max.must > 17
|
110
|
+
#
|
111
|
+
# # Constrains the maximum value of +set+ to equal the integer variable
|
112
|
+
# # +max+.
|
113
|
+
# set.max.must == max
|
114
|
+
#
|
115
|
+
# # Constrains the maximum value of +set+ to not be less than the
|
116
|
+
# # integer variable +floor+.
|
117
|
+
# set.max.must_not < floor
|
118
|
+
#
|
119
|
+
# # The same as above but reified with the boolean variable
|
120
|
+
# # +is_not_below_floor+ and with the strength +domain+ applied.
|
121
|
+
# set.max.must_not_be.less_than(ceil, :reify => :is_not_below_floor,
|
122
|
+
# :strength => :domain)
|
85
123
|
class MaxExpressionStub < Gecode::Constraints::Int::CompositeStub
|
86
124
|
def constrain_equal(variable, params, constrain)
|
87
125
|
set = params[:lhs]
|
@@ -93,7 +131,26 @@ module Gecode::Constraints::Set
|
|
93
131
|
end
|
94
132
|
end
|
95
133
|
|
96
|
-
# Describes
|
134
|
+
# Describes a CompositeStub for the sum constraint which constrains the
|
135
|
+
# sum of all values in a set variable.
|
136
|
+
#
|
137
|
+
# == Examples
|
138
|
+
#
|
139
|
+
# # Constrains the sum of all values in +set+ to be larger than 17.
|
140
|
+
# set.sum.must > 17
|
141
|
+
#
|
142
|
+
# # Constrains the sum of all values in +set+ to equal the integer
|
143
|
+
# # variable +sum+.
|
144
|
+
# set.sum.must == sum
|
145
|
+
#
|
146
|
+
# # Constrains the sum of all values in +set+ to not be larger than the
|
147
|
+
# # integer variable +resources+.
|
148
|
+
# set.sum.must_not > resources
|
149
|
+
#
|
150
|
+
# # The same as above but reified with the boolean variable
|
151
|
+
# # +not_over_budget+ and with the strength +domain+ applied.
|
152
|
+
# set.sum.must_not_be.larger_than(resources, :reify => :not_over_budget,
|
153
|
+
# :strength => :domain)
|
97
154
|
class SumExpressionStub < Gecode::Constraints::Int::CompositeStub
|
98
155
|
def constrain_equal(variable, params, constrain)
|
99
156
|
set, subs = params.values_at(:lhs, :substitutions)
|
@@ -114,8 +171,17 @@ module Gecode::Constraints::Set
|
|
114
171
|
end
|
115
172
|
end
|
116
173
|
|
117
|
-
# Describes
|
118
|
-
# integer variables.
|
174
|
+
# Describes an include constraint, which constrains the set to include the
|
175
|
+
# values of the specified enumeration of integer variables.
|
176
|
+
#
|
177
|
+
# The constraint has the side effect of sorting the integer variables in a
|
178
|
+
# non-descending order. It does not support reification nor negation.
|
179
|
+
#
|
180
|
+
# == Examples
|
181
|
+
#
|
182
|
+
# # Constrain +set+ to include the values of all variables in
|
183
|
+
# # +int_enum+.
|
184
|
+
# set.must.include int_enum
|
119
185
|
class IncludeConstraint < Gecode::Constraints::Constraint
|
120
186
|
def post
|
121
187
|
set, variables = @params.values_at(:lhs, :variables)
|