gecoder-with-gecode 0.7.1-mswin32
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 +81 -0
- data/COPYING +17 -0
- data/LGPL-LICENSE +458 -0
- data/README +45 -0
- data/Rakefile +13 -0
- data/example/example_helper.rb +1 -0
- data/example/magic_sequence.rb +43 -0
- data/example/queens.rb +43 -0
- data/example/raw_bindings.rb +42 -0
- data/example/send_more_money.rb +43 -0
- data/example/send_most_money.rb +58 -0
- data/example/square_tiling.rb +84 -0
- data/example/sudoku-set.rb +110 -0
- data/example/sudoku.rb +61 -0
- data/lib/gecode.dll +0 -0
- data/lib/gecoder.rb +5 -0
- data/lib/gecoder/bindings.rb +54 -0
- data/lib/gecoder/bindings/bindings.rb +2210 -0
- data/lib/gecoder/interface.rb +8 -0
- data/lib/gecoder/interface/binding_changes.rb +313 -0
- data/lib/gecoder/interface/branch.rb +152 -0
- data/lib/gecoder/interface/constraints.rb +397 -0
- data/lib/gecoder/interface/constraints/bool/boolean.rb +246 -0
- data/lib/gecoder/interface/constraints/bool/linear.rb +29 -0
- data/lib/gecoder/interface/constraints/bool_enum/boolean.rb +84 -0
- data/lib/gecoder/interface/constraints/bool_enum_constraints.rb +8 -0
- data/lib/gecoder/interface/constraints/bool_var_constraints.rb +75 -0
- data/lib/gecoder/interface/constraints/int/arithmetic.rb +71 -0
- data/lib/gecoder/interface/constraints/int/domain.rb +78 -0
- data/lib/gecoder/interface/constraints/int/linear.rb +295 -0
- data/lib/gecoder/interface/constraints/int_enum/arithmetic.rb +72 -0
- data/lib/gecoder/interface/constraints/int_enum/channel.rb +100 -0
- data/lib/gecoder/interface/constraints/int_enum/count.rb +92 -0
- data/lib/gecoder/interface/constraints/int_enum/distinct.rb +69 -0
- data/lib/gecoder/interface/constraints/int_enum/element.rb +82 -0
- data/lib/gecoder/interface/constraints/int_enum/equality.rb +38 -0
- data/lib/gecoder/interface/constraints/int_enum/sort.rb +126 -0
- data/lib/gecoder/interface/constraints/int_enum_constraints.rb +37 -0
- data/lib/gecoder/interface/constraints/int_var_constraints.rb +58 -0
- data/lib/gecoder/interface/constraints/reifiable_constraints.rb +78 -0
- data/lib/gecoder/interface/constraints/set/cardinality.rb +75 -0
- data/lib/gecoder/interface/constraints/set/connection.rb +193 -0
- data/lib/gecoder/interface/constraints/set/domain.rb +109 -0
- data/lib/gecoder/interface/constraints/set/operation.rb +132 -0
- data/lib/gecoder/interface/constraints/set/relation.rb +178 -0
- data/lib/gecoder/interface/constraints/set_enum/channel.rb +18 -0
- data/lib/gecoder/interface/constraints/set_enum/distinct.rb +80 -0
- data/lib/gecoder/interface/constraints/set_enum/operation.rb +60 -0
- data/lib/gecoder/interface/constraints/set_enum/selection.rb +217 -0
- data/lib/gecoder/interface/constraints/set_enum_constraints.rb +34 -0
- data/lib/gecoder/interface/constraints/set_var_constraints.rb +72 -0
- data/lib/gecoder/interface/enum_matrix.rb +64 -0
- data/lib/gecoder/interface/enum_wrapper.rb +153 -0
- data/lib/gecoder/interface/model.rb +251 -0
- data/lib/gecoder/interface/search.rb +123 -0
- data/lib/gecoder/interface/variables.rb +254 -0
- data/lib/gecoder/version.rb +4 -0
- data/specs/binding_changes.rb +76 -0
- data/specs/bool_var.rb +74 -0
- data/specs/branch.rb +170 -0
- data/specs/constraints/arithmetic.rb +266 -0
- data/specs/constraints/bool_enum.rb +140 -0
- data/specs/constraints/boolean.rb +232 -0
- data/specs/constraints/cardinality.rb +154 -0
- data/specs/constraints/channel.rb +126 -0
- data/specs/constraints/connection.rb +373 -0
- data/specs/constraints/constraint_helper.rb +180 -0
- data/specs/constraints/constraints.rb +74 -0
- data/specs/constraints/count.rb +139 -0
- data/specs/constraints/distinct.rb +218 -0
- data/specs/constraints/element.rb +106 -0
- data/specs/constraints/equality.rb +31 -0
- data/specs/constraints/int_domain.rb +69 -0
- data/specs/constraints/int_relation.rb +78 -0
- data/specs/constraints/linear.rb +332 -0
- data/specs/constraints/reification_sugar.rb +96 -0
- data/specs/constraints/selection.rb +292 -0
- data/specs/constraints/set_domain.rb +181 -0
- data/specs/constraints/set_operation.rb +285 -0
- data/specs/constraints/set_relation.rb +201 -0
- data/specs/constraints/sort.rb +175 -0
- data/specs/distribution.rb +14 -0
- data/specs/enum_matrix.rb +43 -0
- data/specs/enum_wrapper.rb +122 -0
- data/specs/int_var.rb +144 -0
- data/specs/logging.rb +24 -0
- data/specs/model.rb +190 -0
- data/specs/search.rb +246 -0
- data/specs/set_var.rb +68 -0
- data/specs/spec_helper.rb +93 -0
- data/tasks/all_tasks.rb +1 -0
- data/tasks/building.howto +65 -0
- data/tasks/distribution.rake +156 -0
- data/tasks/rcov.rake +17 -0
- data/tasks/specs.rake +15 -0
- data/tasks/svn.rake +11 -0
- data/tasks/website.rake +51 -0
- data/vendor/gecode/win32/lib/libgecodeint.dll +0 -0
- data/vendor/gecode/win32/lib/libgecodekernel.dll +0 -0
- data/vendor/gecode/win32/lib/libgecodeminimodel.dll +0 -0
- data/vendor/gecode/win32/lib/libgecodesearch.dll +0 -0
- data/vendor/gecode/win32/lib/libgecodeset.dll +0 -0
- data/vendor/rust/README +28 -0
- data/vendor/rust/bin/cxxgenerator.rb +93 -0
- data/vendor/rust/include/rust_checks.hh +115 -0
- data/vendor/rust/include/rust_conversions.hh +102 -0
- data/vendor/rust/rust.rb +67 -0
- data/vendor/rust/rust/attribute.rb +51 -0
- data/vendor/rust/rust/bindings.rb +172 -0
- data/vendor/rust/rust/class.rb +339 -0
- data/vendor/rust/rust/constants.rb +48 -0
- data/vendor/rust/rust/container.rb +110 -0
- data/vendor/rust/rust/cppifaceparser.rb +129 -0
- data/vendor/rust/rust/cwrapper.rb +72 -0
- data/vendor/rust/rust/cxxclass.rb +98 -0
- data/vendor/rust/rust/element.rb +81 -0
- data/vendor/rust/rust/enum.rb +63 -0
- data/vendor/rust/rust/function.rb +407 -0
- data/vendor/rust/rust/namespace.rb +61 -0
- data/vendor/rust/rust/templates/AttributeDefinition.rusttpl +17 -0
- data/vendor/rust/rust/templates/AttributeInitBinding.rusttpl +9 -0
- data/vendor/rust/rust/templates/BindingsHeader.rusttpl +24 -0
- data/vendor/rust/rust/templates/BindingsUnit.rusttpl +46 -0
- data/vendor/rust/rust/templates/CWrapperClassDefinitions.rusttpl +64 -0
- data/vendor/rust/rust/templates/ClassDeclarations.rusttpl +7 -0
- data/vendor/rust/rust/templates/ClassInitialize.rusttpl +6 -0
- data/vendor/rust/rust/templates/ConstructorStub.rusttpl +21 -0
- data/vendor/rust/rust/templates/CxxClassDefinitions.rusttpl +91 -0
- data/vendor/rust/rust/templates/CxxMethodStub.rusttpl +12 -0
- data/vendor/rust/rust/templates/CxxStandaloneClassDefinitions.rusttpl +26 -0
- data/vendor/rust/rust/templates/EnumDeclarations.rusttpl +3 -0
- data/vendor/rust/rust/templates/EnumDefinitions.rusttpl +29 -0
- data/vendor/rust/rust/templates/FunctionDefinition.rusttpl +9 -0
- data/vendor/rust/rust/templates/FunctionInitAlias.rusttpl +5 -0
- data/vendor/rust/rust/templates/FunctionInitBinding.rusttpl +9 -0
- data/vendor/rust/rust/templates/MethodInitBinding.rusttpl +9 -0
- data/vendor/rust/rust/templates/ModuleDeclarations.rusttpl +3 -0
- data/vendor/rust/rust/templates/ModuleDefinitions.rusttpl +3 -0
- data/vendor/rust/rust/templates/StandaloneClassDeclarations.rusttpl +7 -0
- data/vendor/rust/rust/templates/VariableFunctionCall.rusttpl +14 -0
- data/vendor/rust/rust/type.rb +98 -0
- data/vendor/rust/test/Makefile +4 -0
- data/vendor/rust/test/constants.rb +36 -0
- data/vendor/rust/test/cppclass.cc +45 -0
- data/vendor/rust/test/cppclass.hh +67 -0
- data/vendor/rust/test/cppclass.rb +59 -0
- data/vendor/rust/test/cwrapper.c +74 -0
- data/vendor/rust/test/cwrapper.h +41 -0
- data/vendor/rust/test/cwrapper.rb +56 -0
- data/vendor/rust/test/dummyclass.hh +31 -0
- data/vendor/rust/test/lib/extension-test.rb +98 -0
- data/vendor/rust/test/operators.cc +41 -0
- data/vendor/rust/test/operators.hh +39 -0
- data/vendor/rust/test/operators.rb +39 -0
- data/vendor/rust/test/test-constants.rb +43 -0
- data/vendor/rust/test/test-cppclass.rb +82 -0
- data/vendor/rust/test/test-cwrapper.rb +80 -0
- data/vendor/rust/test/test-operators.rb +42 -0
- metadata +293 -0
@@ -0,0 +1,109 @@
|
|
1
|
+
module Gecode::Constraints::Set
|
2
|
+
class Expression
|
3
|
+
Gecode::Constraints::Util::SET_RELATION_TYPES.each_pair do |name, type|
|
4
|
+
module_eval <<-"end_code"
|
5
|
+
# Creates a domain constraint using the specified constant set.
|
6
|
+
def #{name}(constant_set, options = {})
|
7
|
+
add_domain_constraint(:#{name}, constant_set, options)
|
8
|
+
end
|
9
|
+
end_code
|
10
|
+
end
|
11
|
+
alias_set_methods
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
# Adds a domain constraint for the specified relation name, constant set
|
16
|
+
# and options.
|
17
|
+
def add_domain_constraint(relation_name, constant_set, options)
|
18
|
+
unless Gecode::Constraints::Util.constant_set? constant_set
|
19
|
+
raise TypeError, "Expected constant set, got #{constant_set.class}."
|
20
|
+
end
|
21
|
+
@params[:rhs] = constant_set
|
22
|
+
@params[:relation] = relation_name
|
23
|
+
@params.update Gecode::Constraints::Set::Util.decode_options(options)
|
24
|
+
if relation_name == :==
|
25
|
+
@model.add_constraint Domain::EqualityDomainConstraint.new(@model,
|
26
|
+
@params)
|
27
|
+
else
|
28
|
+
@model.add_constraint Domain::DomainConstraint.new(@model, @params)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# A module that gathers the classes and modules used in domain constraints.
|
34
|
+
module Domain #:nodoc:
|
35
|
+
# Describes a domain constraint which constrains a set to be equal to a
|
36
|
+
# constant set.
|
37
|
+
#
|
38
|
+
# == Examples
|
39
|
+
#
|
40
|
+
# # +set+ must equal [1,2,5]
|
41
|
+
# set.must == [1,2,5]
|
42
|
+
#
|
43
|
+
# # +set+ must not equal 1..67
|
44
|
+
# set.must_not == 1..67
|
45
|
+
#
|
46
|
+
# # +set+ must equal the singleton set 0. The constraint is reified with
|
47
|
+
# # the boolean varaible +is_singleton_zero+.
|
48
|
+
# set.must.equal(0, :reify => is_singleton_zero)
|
49
|
+
class EqualityDomainConstraint < Gecode::Constraints::ReifiableConstraint
|
50
|
+
def post
|
51
|
+
var, domain, reif_var, negate = @params.values_at(:lhs, :rhs, :reif,
|
52
|
+
:negate)
|
53
|
+
if negate
|
54
|
+
rel_type = Gecode::Constraints::Util::NEGATED_SET_RELATION_TYPES[:==]
|
55
|
+
else
|
56
|
+
rel_type = Gecode::Constraints::Util::SET_RELATION_TYPES[:==]
|
57
|
+
end
|
58
|
+
|
59
|
+
(params = []) << var.bind
|
60
|
+
params << rel_type
|
61
|
+
params << Gecode::Constraints::Util.constant_set_to_params(domain)
|
62
|
+
params << reif_var.bind if reif_var.respond_to? :bind
|
63
|
+
Gecode::Raw::dom(@model.active_space, *params.flatten)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# Describes a domain constraint which constrains a set to have a specific
|
68
|
+
# relation to a constant set. A constant set may be specified in three ways
|
69
|
+
#
|
70
|
+
# [Fixnum] Represents a singleton set.
|
71
|
+
# [Range] Represents a set containing all elements in the
|
72
|
+
# range. This represents the set more efficiently
|
73
|
+
# than when another enumeration with the same
|
74
|
+
# elements are used.
|
75
|
+
# [Enumeration of Fixnum] Represents a set containing the enumeration’s
|
76
|
+
# elements.
|
77
|
+
#
|
78
|
+
# The relations allowed are the same as in
|
79
|
+
# <tt>Set::Relation::RelationConstraint</tt>.
|
80
|
+
#
|
81
|
+
# == Examples
|
82
|
+
#
|
83
|
+
# # +set+ must be subset of [1,2,5]
|
84
|
+
# set.must_be.subset_of [1,2,5]
|
85
|
+
#
|
86
|
+
# # +set+ must be disjoint with 1..67
|
87
|
+
# set.must_be.disjoint_with 1..67
|
88
|
+
#
|
89
|
+
# # +set+ must not be a superset of [0].
|
90
|
+
# set.must_not_be.superset_of 0
|
91
|
+
#
|
92
|
+
# # +set+ must be subset of [1,3,5,7]. The constraint is reified with
|
93
|
+
# # the boolean varaible +only_constains_odd_values+.
|
94
|
+
# set.must_be.subset_of([1.3.5.7], :reify => only_contains_odd_values)
|
95
|
+
class DomainConstraint < Gecode::Constraints::ReifiableConstraint
|
96
|
+
def post
|
97
|
+
var, domain, reif_var, relation = @params.values_at(:lhs, :rhs, :reif,
|
98
|
+
:relation)
|
99
|
+
|
100
|
+
(params = []) << var.bind
|
101
|
+
params << Gecode::Constraints::Util::SET_RELATION_TYPES[relation]
|
102
|
+
params << Gecode::Constraints::Util.constant_set_to_params(domain)
|
103
|
+
params << reif_var.bind if reif_var.respond_to? :bind
|
104
|
+
Gecode::Raw::dom(@model.active_space, *params.flatten)
|
105
|
+
end
|
106
|
+
negate_using_reification
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
module Gecode
|
2
|
+
class FreeSetVar
|
3
|
+
Gecode::Constraints::Util::SET_OPERATION_TYPES.each_pair do |name, type|
|
4
|
+
module_eval <<-"end_code"
|
5
|
+
# Starts a constraint on this set #{name} the specified set.
|
6
|
+
def #{name}(operand)
|
7
|
+
unless operand.kind_of?(Gecode::FreeSetVar) or
|
8
|
+
Gecode::Constraints::Util::constant_set?(operand)
|
9
|
+
raise TypeError, 'Expected set variable or constant set as ' +
|
10
|
+
"operand, got \#{operand.class}."
|
11
|
+
end
|
12
|
+
|
13
|
+
params = {:lhs => self, :op2 => operand, :operation => #{type}}
|
14
|
+
Gecode::Constraints::SimpleExpressionStub.new(@model, params) do |m, ps|
|
15
|
+
Gecode::Constraints::Set::Operation::Expression.new(m, ps)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end_code
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
module FixnumEnumMethods
|
23
|
+
Gecode::Constraints::Util::SET_OPERATION_TYPES.each_pair do |name, type|
|
24
|
+
module_eval <<-"end_code"
|
25
|
+
# Starts a constraint on this set union the specified set.
|
26
|
+
def #{name}(operand)
|
27
|
+
unless operand.kind_of?(Gecode::FreeSetVar) or
|
28
|
+
Gecode::Constraints::Util::constant_set?(operand)
|
29
|
+
raise TypeError, 'Expected set variable or constant set as ' +
|
30
|
+
"operand, got \#{operand.class}."
|
31
|
+
end
|
32
|
+
|
33
|
+
params = {:lhs => self, :op2 => operand, :operation => #{type}}
|
34
|
+
Gecode::Constraints::SimpleExpressionStub.new(@model, params) do |m, ps|
|
35
|
+
Gecode::Constraints::Set::Operation::Expression.new(m, ps)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end_code
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
module Gecode::Constraints::Set
|
44
|
+
# A module that gathers the classes and modules used in operation constraints.
|
45
|
+
module Operation #:nodoc:
|
46
|
+
# An expression with a set operand and two operands followed by must.
|
47
|
+
class Expression < Gecode::Constraints::Expression #:nodoc:
|
48
|
+
Gecode::Constraints::Util::SET_RELATION_TYPES.each_pair do |name, type|
|
49
|
+
module_eval <<-"end_code"
|
50
|
+
# Creates an operation constraint using the specified expression.
|
51
|
+
def #{name}(expression)
|
52
|
+
if @params[:negate]
|
53
|
+
# We do not allow negation.
|
54
|
+
raise Gecode::MissingConstraintError, 'A negated set operation ' +
|
55
|
+
'constraint is not implemented.'
|
56
|
+
end
|
57
|
+
unless expression.kind_of?(Gecode::FreeSetVar) or
|
58
|
+
Gecode::Constraints::Util::constant_set?(expression)
|
59
|
+
raise TypeError, 'Expected set variable or constant set, got ' +
|
60
|
+
"\#{expression.class}."
|
61
|
+
end
|
62
|
+
|
63
|
+
@params[:rhs] = expression
|
64
|
+
@params[:relation] = #{type}
|
65
|
+
unless @params.values_at(:lhs, :op2, :rhs).any?{ |element|
|
66
|
+
element.kind_of? Gecode::FreeSetVar}
|
67
|
+
# At least one variable must be involved in the constraint.
|
68
|
+
raise ArgumentError, 'At least one variable must be involved ' +
|
69
|
+
'in the constraint, but all given were constants.'
|
70
|
+
end
|
71
|
+
|
72
|
+
@model.add_constraint OperationConstraint.new(@model, @params)
|
73
|
+
end
|
74
|
+
end_code
|
75
|
+
end
|
76
|
+
alias_set_methods
|
77
|
+
end
|
78
|
+
|
79
|
+
# Describes an operation constraint, which constrains the result of an
|
80
|
+
# operation with two sets as operands. Either constant sets or set
|
81
|
+
# variables may be used for the result and operands, with the exception of
|
82
|
+
# that all three may not be constant sets.
|
83
|
+
#
|
84
|
+
# The typical form is
|
85
|
+
# set_operand_1.<operation>(set_operand_2).must.<relation>(result_set)
|
86
|
+
#
|
87
|
+
# The following operations are supported:
|
88
|
+
#
|
89
|
+
# * union
|
90
|
+
# * disjoint_union
|
91
|
+
# * intersection
|
92
|
+
# * minus
|
93
|
+
#
|
94
|
+
# The allowed relations are the same as for
|
95
|
+
# <tt>Set::Relation::RelationConstraint</tt>.
|
96
|
+
#
|
97
|
+
# Neither reification nor negation is supported.
|
98
|
+
#
|
99
|
+
# == Examples
|
100
|
+
#
|
101
|
+
# # +set_1+ union +set_2+ must equal +set_3+.
|
102
|
+
# set_1.union(set_2).must == set_3
|
103
|
+
#
|
104
|
+
# # +set_1+ intersection [3,5,6] must equal +set_3+.
|
105
|
+
# set_1.intersection([3,5,6]).must == set_3
|
106
|
+
#
|
107
|
+
# # [0,1,2] minus +set_2+ must be superset of +set_3+.
|
108
|
+
# wrap_enum([0,1,2]).minus(set_2).must_be.superset_of(set_3)
|
109
|
+
#
|
110
|
+
# # +set_1+ disjoint union with [0] must be subset of 0..17.
|
111
|
+
# set_1.disjoint_union(0).must_be.subset_of 0..17
|
112
|
+
class OperationConstraint < Gecode::Constraints::Constraint
|
113
|
+
def post
|
114
|
+
op1, op2, operation, relation, rhs, negate = @params.values_at(:lhs,
|
115
|
+
:op2, :operation, :relation, :rhs, :negate)
|
116
|
+
|
117
|
+
op1, op2, rhs = [op1, op2, rhs].map do |expression|
|
118
|
+
# The expressions can either be set variables or constant sets,
|
119
|
+
# convert them appropriately.
|
120
|
+
if expression.respond_to? :bind
|
121
|
+
expression.bind
|
122
|
+
else
|
123
|
+
Gecode::Constraints::Util::constant_set_to_int_set(expression)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
Gecode::Raw::rel(@model.active_space, op1, operation, op2, relation,
|
128
|
+
rhs)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,178 @@
|
|
1
|
+
module Gecode
|
2
|
+
class FreeSetVar
|
3
|
+
# Starts a constraint on all the elements of the set.
|
4
|
+
def elements
|
5
|
+
params = {:lhs => self}
|
6
|
+
Gecode::Constraints::SimpleExpressionStub.new(@model, params) do |m, ps|
|
7
|
+
Gecode::Constraints::Set::Relation::ElementExpression.new(m, ps)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module Gecode::Constraints::Set
|
14
|
+
class Expression
|
15
|
+
Gecode::Constraints::Util::SET_RELATION_TYPES.each_pair do |name, type|
|
16
|
+
module_eval <<-"end_code"
|
17
|
+
# Wrap previous relation methods providing support for relation
|
18
|
+
# constraints.
|
19
|
+
alias_method 'pre_relation_#{type}_method'.to_sym, :#{name}
|
20
|
+
|
21
|
+
# Creates a relation constraint using the specified expression.
|
22
|
+
def #{name}(expression, options = {})
|
23
|
+
if expression.kind_of? Gecode::FreeSetVar
|
24
|
+
add_relation_constraint(:#{name}, expression, options)
|
25
|
+
else
|
26
|
+
# Send it on.
|
27
|
+
pre_relation_#{type}_method(expression, options)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end_code
|
31
|
+
end
|
32
|
+
alias_set_methods
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
# Adds a relation constraint for the specified relation name, set variable
|
37
|
+
# and options.
|
38
|
+
def add_relation_constraint(relation_name, set, options)
|
39
|
+
@params[:rhs] = set
|
40
|
+
@params[:relation] = relation_name
|
41
|
+
@params.update Gecode::Constraints::Set::Util.decode_options(options)
|
42
|
+
if relation_name == :==
|
43
|
+
@model.add_constraint Relation::EqualityRelationConstraint.new(@model,
|
44
|
+
@params)
|
45
|
+
else
|
46
|
+
@model.add_constraint Relation::RelationConstraint.new(@model, @params)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# A module that gathers the classes and modules used in relation constraints.
|
52
|
+
module Relation #:nodoc:
|
53
|
+
# Describes a relation constraint which constrains a set variable to be
|
54
|
+
# equal to another set variable. Equality may either be expressed as
|
55
|
+
# +==+, +equal+ or +equal_to+.
|
56
|
+
#
|
57
|
+
# == Examples
|
58
|
+
#
|
59
|
+
# # +set_1+ must be equal to +set_2+
|
60
|
+
# set_1.must == set_2
|
61
|
+
#
|
62
|
+
# # +set_1+ must not be equal to +set_2+
|
63
|
+
# set_1.must_not == set_2
|
64
|
+
#
|
65
|
+
# # The same as above but reified with the boolean variable
|
66
|
+
# # +are_not_equal+.
|
67
|
+
# set_1.must_not.equal(set_2, :reify => are_not_equal)
|
68
|
+
class EqualityRelationConstraint < Gecode::Constraints::ReifiableConstraint
|
69
|
+
def post
|
70
|
+
var, rhs, reif_var, negate = @params.values_at(:lhs, :rhs, :reif,
|
71
|
+
:negate)
|
72
|
+
if negate
|
73
|
+
rel_type = Gecode::Constraints::Util::NEGATED_SET_RELATION_TYPES[:==]
|
74
|
+
else
|
75
|
+
rel_type = Gecode::Constraints::Util::SET_RELATION_TYPES[:==]
|
76
|
+
end
|
77
|
+
|
78
|
+
(params = []) << var.bind
|
79
|
+
params << rel_type
|
80
|
+
params << rhs.bind
|
81
|
+
params << reif_var.bind if reif_var.respond_to? :bind
|
82
|
+
Gecode::Raw::rel(@model.active_space, *params)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# Describes a relation constraint which constrains a set variable to have
|
87
|
+
# a specified relation to another set variable. The allowed relations and
|
88
|
+
# their aliases are
|
89
|
+
#
|
90
|
+
# * subset, subset_of
|
91
|
+
# * superset, superset_of
|
92
|
+
# * disjoint, disjoint_with
|
93
|
+
# * complement, complement_of
|
94
|
+
#
|
95
|
+
# == Examples
|
96
|
+
#
|
97
|
+
# # +set_1+ must be subset of +set_2+
|
98
|
+
# set_1.must_be.subset_of set_2
|
99
|
+
#
|
100
|
+
# # +set_1+ must not be superset of +set_2+
|
101
|
+
# set_1.must_not_be.superset_of set_2
|
102
|
+
#
|
103
|
+
# # +set_1+ must be disjoint with +set_2+
|
104
|
+
# set_1.must_be.disjoint set_2
|
105
|
+
#
|
106
|
+
# # The same as above but reified with the boolean variable
|
107
|
+
# # +are_disjoint+.
|
108
|
+
# set_1.must_be.disjoint(set_2, :reify => are_disjoint)
|
109
|
+
class RelationConstraint < Gecode::Constraints::ReifiableConstraint
|
110
|
+
def post
|
111
|
+
var, rhs, reif_var, relation = @params.values_at(:lhs, :rhs, :reif,
|
112
|
+
:relation)
|
113
|
+
|
114
|
+
(params = []) << var.bind
|
115
|
+
params << Gecode::Constraints::Util::SET_RELATION_TYPES[relation]
|
116
|
+
params << rhs.bind
|
117
|
+
params << reif_var.bind if reif_var.respond_to? :bind
|
118
|
+
Gecode::Raw::rel(@model.active_space, *params)
|
119
|
+
end
|
120
|
+
negate_using_reification
|
121
|
+
end
|
122
|
+
|
123
|
+
# Describes an element relation constraint which constrains all elements in
|
124
|
+
# a set variable to satisfy an integer relation constraint. The relations
|
125
|
+
# supported are the same as in
|
126
|
+
# <tt>Int::Linear::SimpleRelationConstraint</tt>.
|
127
|
+
#
|
128
|
+
# Reification is not supported.
|
129
|
+
#
|
130
|
+
# == Examples
|
131
|
+
#
|
132
|
+
# # All elements in +set+ must be larger than 5.
|
133
|
+
# set.elements.must > 5
|
134
|
+
#
|
135
|
+
# # No element in +set+ may equal 0.
|
136
|
+
# set.elements.must_not == 0
|
137
|
+
#
|
138
|
+
# # No element in +set+ may contain the value of the integer variable
|
139
|
+
# # +forbidden_number+.
|
140
|
+
# set.elements.must_not == forbidden_number
|
141
|
+
class ElementRelationConstraint < Gecode::Constraints::Constraint
|
142
|
+
def post
|
143
|
+
var, rhs, relation = @params.values_at(:lhs, :rhs, :relation)
|
144
|
+
|
145
|
+
if @params[:negate]
|
146
|
+
type = Gecode::Constraints::Util::NEGATED_RELATION_TYPES[relation]
|
147
|
+
else
|
148
|
+
type = Gecode::Constraints::Util::RELATION_TYPES[relation]
|
149
|
+
end
|
150
|
+
|
151
|
+
if rhs.kind_of? Fixnum
|
152
|
+
# Use a proxy int variable to cover.
|
153
|
+
rhs = @model.int_var(rhs)
|
154
|
+
end
|
155
|
+
Gecode::Raw::rel(@model.active_space, var.bind, type, rhs.bind)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
# Describes an expression which starts with set.elements.must* .
|
160
|
+
class ElementExpression < Gecode::Constraints::Expression #:nodoc:
|
161
|
+
Gecode::Constraints::Util::RELATION_TYPES.each_key do |name|
|
162
|
+
module_eval <<-"end_code"
|
163
|
+
# Creates an elements constraint using the specified expression, which
|
164
|
+
# may be either a constant integer of variable.
|
165
|
+
def #{name}(expression)
|
166
|
+
unless expression.kind_of?(Fixnum) or
|
167
|
+
expression.kind_of?(Gecode::FreeIntVar)
|
168
|
+
raise TypeError, "Invalid expression type \#{expression.class}."
|
169
|
+
end
|
170
|
+
@params.update(:rhs => expression, :relation => :#{name})
|
171
|
+
@model.add_constraint ElementRelationConstraint.new(@model, @params)
|
172
|
+
end
|
173
|
+
end_code
|
174
|
+
end
|
175
|
+
alias_comparison_methods
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Gecode::Constraints::SetEnum
|
2
|
+
class Expression
|
3
|
+
# Posts a channel constraint on the variables in the enum with the specified
|
4
|
+
# int enum.
|
5
|
+
def channel(enum)
|
6
|
+
unless enum.respond_to? :to_int_var_array
|
7
|
+
raise TypeError, "Expected integer variable enum, for #{enum.class}."
|
8
|
+
end
|
9
|
+
|
10
|
+
# Just provide commutativity to the corresponding int enum constraint.
|
11
|
+
if @params[:negate]
|
12
|
+
enum.must_not.channel(@params[:lhs])
|
13
|
+
else
|
14
|
+
enum.must.channel(@params[:lhs])
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module Gecode::Constraints::SetEnum
|
2
|
+
class Expression
|
3
|
+
# Adds a distinct constraint on the sets in the enum. The "option" :size
|
4
|
+
# must be specified, the sets will be constrained to that size.
|
5
|
+
def distinct(options = {})
|
6
|
+
unless options.has_key? :size
|
7
|
+
raise ArgumentError, 'Option :size has to be specified.'
|
8
|
+
end
|
9
|
+
unless options.size == 1
|
10
|
+
raise ArgumentError, 'Only the option :size is accepted, got ' +
|
11
|
+
"#{options.keys.join(', ')}."
|
12
|
+
end
|
13
|
+
if @params[:negate]
|
14
|
+
raise Gecode::MissingConstraintError, 'A negated distinct is not ' +
|
15
|
+
'implemented.'
|
16
|
+
end
|
17
|
+
|
18
|
+
@model.add_constraint Distinct::DistinctConstraint.new(
|
19
|
+
@model, @params.update(options))
|
20
|
+
end
|
21
|
+
|
22
|
+
# Adds a constraint on the sets that specifies that they must have at most
|
23
|
+
# one element in common. The "option" :size must be specified, the sets
|
24
|
+
# will be constrained to that size.
|
25
|
+
def at_most_share_one_element(options = {})
|
26
|
+
unless options.has_key? :size
|
27
|
+
raise ArgumentError, 'Option :size has to be specified.'
|
28
|
+
end
|
29
|
+
unless options.size == 1
|
30
|
+
raise ArgumentError, 'Only the option :size is accepted, got ' +
|
31
|
+
"#{options.keys.join(', ')}."
|
32
|
+
end
|
33
|
+
if @params[:negate]
|
34
|
+
raise Gecode::MissingConstraintError, 'A negated atmost one ' +
|
35
|
+
'constrain is not implemented.'
|
36
|
+
end
|
37
|
+
|
38
|
+
@model.add_constraint Distinct::AtMostOneConstraint.new(
|
39
|
+
@model, @params.update(options))
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# A module that gathers the classes and modules used in distinct constraints.
|
44
|
+
module Distinct #:nodoc:
|
45
|
+
# Describes a set distinct constraint, which constrains all set variables
|
46
|
+
# in the enumeration to be distinct and of a specified size. Providing a
|
47
|
+
# size is not optional.
|
48
|
+
#
|
49
|
+
# Neither negation nor reification is supported.
|
50
|
+
#
|
51
|
+
# == Examples
|
52
|
+
#
|
53
|
+
# # All set variables in +sets+ must have cardinality 4 and be different.
|
54
|
+
# sets.must_be.distinct(:size => 4)
|
55
|
+
class DistinctConstraint < Gecode::Constraints::Constraint
|
56
|
+
def post
|
57
|
+
sets, size = @params.values_at(:lhs, :size)
|
58
|
+
Gecode::Raw::distinct(@model.active_space, sets.to_set_var_array, size)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Describes an at most one constraint, which constrains all pairs of set
|
63
|
+
# variables in the enumeration to at most have one element in common and be
|
64
|
+
# of a specified size. Providing a size is not optional.
|
65
|
+
#
|
66
|
+
# Neither negation nor reification is supported.
|
67
|
+
#
|
68
|
+
# == Examples
|
69
|
+
#
|
70
|
+
# # All set variables in +sets+ must have cardinality 17 and no pair may
|
71
|
+
# # have more than one element in common.
|
72
|
+
# sets.must.at_most_share_one_element(:size => 17)
|
73
|
+
class AtMostOneConstraint < Gecode::Constraints::Constraint
|
74
|
+
def post
|
75
|
+
sets, size = @params.values_at(:lhs, :size)
|
76
|
+
Gecode::Raw::atmostOne(@model.active_space, sets.to_set_var_array, size)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|