gecoder-with-gecode 0.9.0-x86-mswin32-60
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 +137 -0
- data/COPYING +17 -0
- data/LGPL-LICENSE +458 -0
- data/README +58 -0
- data/Rakefile +14 -0
- data/example/equation_system.rb +15 -0
- data/example/example_helper.rb +1 -0
- data/example/magic_sequence.rb +43 -0
- data/example/money.rb +36 -0
- data/example/queens.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 +106 -0
- data/example/sudoku.rb +56 -0
- data/lib/gecode.dll +0 -0
- data/lib/gecoder.rb +5 -0
- data/lib/gecoder/bindings.rb +96 -0
- data/lib/gecoder/bindings/bindings.rb +2029 -0
- data/lib/gecoder/interface.rb +9 -0
- data/lib/gecoder/interface/binding_changes.rb +9 -0
- data/lib/gecoder/interface/branch.rb +163 -0
- data/lib/gecoder/interface/constraints.rb +471 -0
- data/lib/gecoder/interface/constraints/bool/boolean.rb +251 -0
- data/lib/gecoder/interface/constraints/bool/channel.rb +7 -0
- data/lib/gecoder/interface/constraints/bool/linear.rb +200 -0
- data/lib/gecoder/interface/constraints/bool_enum/channel.rb +68 -0
- data/lib/gecoder/interface/constraints/bool_enum/extensional.rb +106 -0
- data/lib/gecoder/interface/constraints/bool_enum/relation.rb +55 -0
- data/lib/gecoder/interface/constraints/bool_enum_constraints.rb +84 -0
- data/lib/gecoder/interface/constraints/bool_var_constraints.rb +155 -0
- data/lib/gecoder/interface/constraints/extensional_regexp.rb +101 -0
- data/lib/gecoder/interface/constraints/fixnum_enum/element.rb +63 -0
- data/lib/gecoder/interface/constraints/fixnum_enum/operation.rb +65 -0
- data/lib/gecoder/interface/constraints/fixnum_enum_constraints.rb +42 -0
- data/lib/gecoder/interface/constraints/int/arithmetic.rb +150 -0
- data/lib/gecoder/interface/constraints/int/channel.rb +51 -0
- data/lib/gecoder/interface/constraints/int/domain.rb +80 -0
- data/lib/gecoder/interface/constraints/int/linear.rb +143 -0
- data/lib/gecoder/interface/constraints/int/relation.rb +141 -0
- data/lib/gecoder/interface/constraints/int_enum/arithmetic.rb +63 -0
- data/lib/gecoder/interface/constraints/int_enum/channel.rb +86 -0
- data/lib/gecoder/interface/constraints/int_enum/count.rb +66 -0
- data/lib/gecoder/interface/constraints/int_enum/distinct.rb +64 -0
- data/lib/gecoder/interface/constraints/int_enum/element.rb +64 -0
- data/lib/gecoder/interface/constraints/int_enum/equality.rb +37 -0
- data/lib/gecoder/interface/constraints/int_enum/extensional.rb +187 -0
- data/lib/gecoder/interface/constraints/int_enum/sort.rb +135 -0
- data/lib/gecoder/interface/constraints/int_enum_constraints.rb +95 -0
- data/lib/gecoder/interface/constraints/int_var_constraints.rb +230 -0
- data/lib/gecoder/interface/constraints/reifiable_constraints.rb +78 -0
- data/lib/gecoder/interface/constraints/selected_set/select.rb +120 -0
- data/lib/gecoder/interface/constraints/selected_set_constraints.rb +75 -0
- data/lib/gecoder/interface/constraints/set/cardinality.rb +65 -0
- data/lib/gecoder/interface/constraints/set/channel.rb +51 -0
- data/lib/gecoder/interface/constraints/set/connection.rb +130 -0
- data/lib/gecoder/interface/constraints/set/domain.rb +156 -0
- data/lib/gecoder/interface/constraints/set/include.rb +36 -0
- data/lib/gecoder/interface/constraints/set/operation.rb +118 -0
- data/lib/gecoder/interface/constraints/set/relation.rb +155 -0
- data/lib/gecoder/interface/constraints/set_elements/relation.rb +116 -0
- data/lib/gecoder/interface/constraints/set_elements_constraints.rb +97 -0
- data/lib/gecoder/interface/constraints/set_enum/channel.rb +45 -0
- data/lib/gecoder/interface/constraints/set_enum/distinct.rb +43 -0
- data/lib/gecoder/interface/constraints/set_enum/operation.rb +69 -0
- data/lib/gecoder/interface/constraints/set_enum/select.rb +79 -0
- data/lib/gecoder/interface/constraints/set_enum_constraints.rb +84 -0
- data/lib/gecoder/interface/constraints/set_var_constraints.rb +243 -0
- data/lib/gecoder/interface/enum_matrix.rb +64 -0
- data/lib/gecoder/interface/enum_wrapper.rb +205 -0
- data/lib/gecoder/interface/model.rb +453 -0
- data/lib/gecoder/interface/model_sugar.rb +84 -0
- data/lib/gecoder/interface/search.rb +197 -0
- data/lib/gecoder/interface/variables.rb +306 -0
- data/lib/gecoder/version.rb +4 -0
- data/specs/bool_var.rb +81 -0
- data/specs/branch.rb +185 -0
- data/specs/constraints/bool/boolean.rb +317 -0
- data/specs/constraints/bool/boolean_properties.rb +51 -0
- data/specs/constraints/bool/linear.rb +213 -0
- data/specs/constraints/bool_enum/bool_enum_relation.rb +117 -0
- data/specs/constraints/bool_enum/channel.rb +102 -0
- data/specs/constraints/bool_enum/extensional.rb +225 -0
- data/specs/constraints/constraint_helper.rb +234 -0
- data/specs/constraints/constraint_receivers.rb +103 -0
- data/specs/constraints/constraints.rb +26 -0
- data/specs/constraints/fixnum_enum/element.rb +58 -0
- data/specs/constraints/fixnum_enum/operation.rb +67 -0
- data/specs/constraints/int/arithmetic.rb +149 -0
- data/specs/constraints/int/channel.rb +101 -0
- data/specs/constraints/int/domain.rb +106 -0
- data/specs/constraints/int/linear.rb +183 -0
- data/specs/constraints/int/linear_properties.rb +97 -0
- data/specs/constraints/int/relation.rb +84 -0
- data/specs/constraints/int_enum/arithmetic.rb +72 -0
- data/specs/constraints/int_enum/channel.rb +57 -0
- data/specs/constraints/int_enum/count.rb +72 -0
- data/specs/constraints/int_enum/distinct.rb +80 -0
- data/specs/constraints/int_enum/element.rb +61 -0
- data/specs/constraints/int_enum/equality.rb +29 -0
- data/specs/constraints/int_enum/extensional.rb +224 -0
- data/specs/constraints/int_enum/sort.rb +167 -0
- data/specs/constraints/operands.rb +264 -0
- data/specs/constraints/property_helper.rb +443 -0
- data/specs/constraints/reification_sugar.rb +69 -0
- data/specs/constraints/selected_set/select.rb +56 -0
- data/specs/constraints/selected_set/select_properties.rb +157 -0
- data/specs/constraints/set/cardinality.rb +58 -0
- data/specs/constraints/set/cardinality_properties.rb +46 -0
- data/specs/constraints/set/channel.rb +77 -0
- data/specs/constraints/set/connection.rb +176 -0
- data/specs/constraints/set/domain.rb +197 -0
- data/specs/constraints/set/include.rb +36 -0
- data/specs/constraints/set/operation.rb +132 -0
- data/specs/constraints/set/relation.rb +117 -0
- data/specs/constraints/set_elements/relation.rb +84 -0
- data/specs/constraints/set_enum/channel.rb +80 -0
- data/specs/constraints/set_enum/distinct.rb +59 -0
- data/specs/constraints/set_enum/operation.rb +111 -0
- data/specs/constraints/set_enum/select.rb +73 -0
- data/specs/distribution.rb +14 -0
- data/specs/enum_matrix.rb +43 -0
- data/specs/enum_wrapper.rb +179 -0
- data/specs/examples.rb +17 -0
- data/specs/int_var.rb +163 -0
- data/specs/logging.rb +24 -0
- data/specs/model.rb +325 -0
- data/specs/model_sugar.rb +30 -0
- data/specs/search.rb +383 -0
- data/specs/selected_set.rb +39 -0
- data/specs/set_elements.rb +34 -0
- data/specs/set_var.rb +82 -0
- data/specs/spec_helper.rb +265 -0
- data/tasks/all_tasks.rb +1 -0
- data/tasks/dependencies.txt +22 -0
- data/tasks/distribution.rake +194 -0
- data/tasks/rcov.rake +18 -0
- data/tasks/specs.rake +21 -0
- data/tasks/svn.rake +16 -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/gecode/win32/lib/libgecodesupport.dll +0 -0
- data/vendor/rust/README +28 -0
- data/vendor/rust/bin/cxxgenerator.rb +93 -0
- data/vendor/rust/include/rust_checks.hh +116 -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 +337 -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 +96 -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 +100 -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 +393 -0
@@ -0,0 +1,106 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../constraint_helper'
|
2
|
+
|
3
|
+
describe Gecode::Int::Domain, ' (non-range)' do
|
4
|
+
before do
|
5
|
+
@model = Gecode::Model.new
|
6
|
+
@domain = 0..3
|
7
|
+
@x = @model.int_var(@domain)
|
8
|
+
@non_range_domain = [1, 3]
|
9
|
+
|
10
|
+
@types = [:int]
|
11
|
+
@invoke = lambda do |receiver, hash|
|
12
|
+
receiver.in(@non_range_domain, hash)
|
13
|
+
@model.solve!
|
14
|
+
end
|
15
|
+
@expect = lambda do |var, opts, reif_var|
|
16
|
+
if reif_var.nil?
|
17
|
+
Gecode::Raw.should_receive(:dom).once.with(
|
18
|
+
an_instance_of(Gecode::Raw::Space),
|
19
|
+
var, an_instance_of(Gecode::Raw::IntSet),
|
20
|
+
*opts)
|
21
|
+
else
|
22
|
+
Gecode::Raw.should_receive(:dom).once.with(
|
23
|
+
an_instance_of(Gecode::Raw::Space),
|
24
|
+
var, an_instance_of(Gecode::Raw::IntSet),
|
25
|
+
reif_var, *opts)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should constrain the domain of the variable' do
|
31
|
+
@x.must_be.in @non_range_domain
|
32
|
+
@model.solve!
|
33
|
+
|
34
|
+
@x.should have_domain(@non_range_domain)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should handle negation' do
|
38
|
+
@x.must_not_be.in @non_range_domain
|
39
|
+
@model.solve!
|
40
|
+
|
41
|
+
@x.should have_domain(@domain.to_a - @non_range_domain.to_a)
|
42
|
+
end
|
43
|
+
|
44
|
+
it_should_behave_like 'reifiable constraint'
|
45
|
+
end
|
46
|
+
|
47
|
+
describe Gecode::Int::Domain, ' (range)' do
|
48
|
+
before do
|
49
|
+
@model = Gecode::Model.new
|
50
|
+
@domain = 0..3
|
51
|
+
@operand = @x = @model.int_var(@domain)
|
52
|
+
@range_domain = 1..2
|
53
|
+
@three_dot_range_domain = 1...2
|
54
|
+
|
55
|
+
@types = [:int]
|
56
|
+
@invoke = lambda do |receiver, hash|
|
57
|
+
receiver.in(@range_domain, hash)
|
58
|
+
@model.solve!
|
59
|
+
end
|
60
|
+
@expect = lambda do |var, opts, reif_var|
|
61
|
+
@model.allow_space_access do
|
62
|
+
if reif_var.nil?
|
63
|
+
Gecode::Raw.should_receive(:dom).once.with(
|
64
|
+
an_instance_of(Gecode::Raw::Space),
|
65
|
+
var, @range_domain.first, @range_domain.last,
|
66
|
+
*opts)
|
67
|
+
else
|
68
|
+
Gecode::Raw.should_receive(:dom).once.with(
|
69
|
+
an_instance_of(Gecode::Raw::Space),
|
70
|
+
var, @range_domain.first, @range_domain.last,
|
71
|
+
reif_var, *opts)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'should constrain the domain of the variable' do
|
78
|
+
@x.must_be.in @range_domain
|
79
|
+
@model.solve!
|
80
|
+
|
81
|
+
@x.should have_domain(@range_domain)
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'should handle negation' do
|
85
|
+
@x.must_not_be.in @range_domain
|
86
|
+
@model.solve!
|
87
|
+
|
88
|
+
@x.should have_domain(@domain.to_a - @range_domain.to_a)
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'should treat three dot ranges correctly' do
|
92
|
+
@x.must_be.in @three_dot_range_domain
|
93
|
+
@model.solve!
|
94
|
+
|
95
|
+
@x.should have_domain(@three_dot_range_domain)
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'should handle three dot range with negation' do
|
99
|
+
@x.must_not_be.in @three_dot_range_domain
|
100
|
+
@model.solve!
|
101
|
+
|
102
|
+
@x.should have_domain(@domain.to_a - @three_dot_range_domain.to_a)
|
103
|
+
end
|
104
|
+
|
105
|
+
it_should_behave_like 'reifiable constraint'
|
106
|
+
end
|
@@ -0,0 +1,183 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../constraint_helper'
|
2
|
+
|
3
|
+
# This is neither an operand or a constraint spec. It is mostly a sanity
|
4
|
+
# check.
|
5
|
+
|
6
|
+
class LinearSampleProblem < Gecode::Model
|
7
|
+
attr :x
|
8
|
+
attr :y
|
9
|
+
attr :z
|
10
|
+
|
11
|
+
def initialize(x_dom, y_dom, z_dom)
|
12
|
+
@x = self.int_var(x_dom)
|
13
|
+
@y = self.int_var(y_dom)
|
14
|
+
@z = self.int_var(z_dom)
|
15
|
+
branch_on wrap_enum([@x, @y, @z])
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe Gecode::Int::Linear do
|
20
|
+
before do
|
21
|
+
@x_dom = 0..2
|
22
|
+
@y_dom = -3..3
|
23
|
+
@z_dom = 0..10
|
24
|
+
@model = LinearSampleProblem.new(@x_dom, @y_dom, @z_dom)
|
25
|
+
@x = @model.x
|
26
|
+
@y = @model.y
|
27
|
+
@z = @model.z
|
28
|
+
@operand = @x + @y
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should handle addition with a variable' do
|
32
|
+
(@x + @y).must == 0
|
33
|
+
sol = @model.solve!
|
34
|
+
x = sol.x.value
|
35
|
+
y = sol.y.value
|
36
|
+
(x + y).should be_zero
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should handle reification (1)' do
|
40
|
+
bool = @model.bool_var
|
41
|
+
(@x + @y).must.equal(0, :reify => bool)
|
42
|
+
bool.must_be.false
|
43
|
+
sol = @model.solve!
|
44
|
+
x = sol.x.value
|
45
|
+
y = sol.y.value
|
46
|
+
(x + y).should_not be_zero
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should handle reification (2)' do
|
50
|
+
bool = @model.bool_var
|
51
|
+
(@x + @y).must.equal(0, :reify => bool)
|
52
|
+
bool.must_be.true
|
53
|
+
sol = @model.solve!
|
54
|
+
x = sol.x.value
|
55
|
+
y = sol.y.value
|
56
|
+
(x + y).should be_zero
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'should handle addition with multiple variables' do
|
60
|
+
(@x + @y + @z).must == 0
|
61
|
+
sol = @model.solve!
|
62
|
+
x = sol.x.value
|
63
|
+
y = sol.y.value
|
64
|
+
z = sol.z.value
|
65
|
+
(x + y + z).should be_zero
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should handle subtraction with a variable' do
|
69
|
+
(@x - @y).must == 0
|
70
|
+
sol = @model.solve!
|
71
|
+
x = sol.x.value
|
72
|
+
y = sol.y.value
|
73
|
+
(x - y).should be_zero
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'should handle non-zero constants as right hand side' do
|
77
|
+
(@x + @y).must == 1
|
78
|
+
sol = @model.solve!
|
79
|
+
x = sol.x.value
|
80
|
+
y = sol.y.value
|
81
|
+
(x + y).should equal(1)
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'should handle variables as right hand side' do
|
85
|
+
(@x + @y).must == @z
|
86
|
+
sol = @model.solve!
|
87
|
+
x = sol.x.value
|
88
|
+
y = sol.y.value
|
89
|
+
z = sol.z.value
|
90
|
+
(x + y).should equal(z)
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'should handle linear expressions as right hand side' do
|
94
|
+
(@x + @y).must == @z + @y
|
95
|
+
sol = @model.solve!
|
96
|
+
x = sol.x.value
|
97
|
+
y = sol.y.value
|
98
|
+
z = sol.z.value
|
99
|
+
(x + y).should equal(z + y)
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'should handle linear expressions as right hand side with variable as left hand side' do
|
103
|
+
@x.must == @z + @y
|
104
|
+
sol = @model.solve!
|
105
|
+
x = sol.x.value
|
106
|
+
y = sol.y.value
|
107
|
+
z = sol.z.value
|
108
|
+
x.should equal(z + y)
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'should raise error on invalid right hand sides' do
|
112
|
+
lambda{ ((@x + @y).must == 'z') }.should raise_error(TypeError)
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'should handle coefficients other than 1' do
|
116
|
+
(@x * 2 + @y).must == 0
|
117
|
+
sol = @model.solve!
|
118
|
+
x = sol.x.value
|
119
|
+
y = sol.y.value
|
120
|
+
(2*x + y).should equal(0)
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'should handle addition with constants' do
|
124
|
+
(@y + 2).must == 1
|
125
|
+
sol = @model.solve!
|
126
|
+
y = sol.y.value
|
127
|
+
(y + 2).should equal(1)
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'should handle subtraction with a constant' do
|
131
|
+
(@x - 2).must == 0
|
132
|
+
sol = @model.solve!
|
133
|
+
x = sol.x.value
|
134
|
+
(x - 2).should be_zero
|
135
|
+
end
|
136
|
+
|
137
|
+
it 'should a single variable as left hande side' do
|
138
|
+
@x.must == @y + @z
|
139
|
+
sol = @model.solve!
|
140
|
+
x = sol.x.value
|
141
|
+
y = sol.y.value
|
142
|
+
z = sol.z.value
|
143
|
+
x.should equal(y + z)
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'should handle parenthesis' do
|
147
|
+
(@x - (@y + @z)).must == 1
|
148
|
+
sol = @model.solve!
|
149
|
+
x = sol.x.value
|
150
|
+
y = sol.y.value
|
151
|
+
z = sol.z.value
|
152
|
+
(x - (y + z)).should equal(1)
|
153
|
+
end
|
154
|
+
|
155
|
+
it 'should handle multiplication of parenthesis' do
|
156
|
+
(((@x + @y*10)*10 + @z)*10).must == 0
|
157
|
+
sol = @model.solve!
|
158
|
+
x = sol.x.value
|
159
|
+
y = sol.y.value
|
160
|
+
z = sol.z.value
|
161
|
+
(((x + y*10)*10 + z)*10).should equal(0)
|
162
|
+
end
|
163
|
+
|
164
|
+
relations = ['>', '>=', '<', '<=', '==']
|
165
|
+
|
166
|
+
relations.each do |relation|
|
167
|
+
it "should handle #{relation} with constant integers" do
|
168
|
+
(@x + @y).must.send(relation, 1)
|
169
|
+
sol = @model.solve!
|
170
|
+
sol.should_not be_nil
|
171
|
+
(sol.x.value + sol.y.value).should.send(relation, 1)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
relations.each do |relation|
|
176
|
+
it "should handle negated #{relation} with constant integers" do
|
177
|
+
(@x + @y).must_not.send(relation, 1)
|
178
|
+
sol = @model.solve!
|
179
|
+
sol.should_not be_nil
|
180
|
+
(sol.x.value + sol.y.value).should_not.send(relation, 1)
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../property_helper'
|
2
|
+
|
3
|
+
class LinearPropertySampleProblem < Gecode::Model
|
4
|
+
attr :x
|
5
|
+
attr :y
|
6
|
+
attr :z
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@x = self.int_var(0..2)
|
10
|
+
@y = self.int_var(-3..3)
|
11
|
+
@z = self.int_var(0..10)
|
12
|
+
branch_on wrap_enum([@x, @y, @z])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe Gecode::Int::Linear, ' (+ property)' do
|
17
|
+
before do
|
18
|
+
@model = LinearPropertySampleProblem.new
|
19
|
+
@x = @model.x
|
20
|
+
@y = @model.y
|
21
|
+
@z = @model.z
|
22
|
+
|
23
|
+
# For int operand producing property spec.
|
24
|
+
@property_types = [:int, :int]
|
25
|
+
@select_property = lambda do |int1, int2|
|
26
|
+
int1 + int2
|
27
|
+
end
|
28
|
+
@selected_property = @x + @y
|
29
|
+
@constraint_class =
|
30
|
+
Gecode::Int::Linear::LinearRelationConstraint
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should constrain the sum' do
|
34
|
+
(@x + @y).must == 5
|
35
|
+
@model.solve!
|
36
|
+
(@x.value + @y.value).should == 5
|
37
|
+
end
|
38
|
+
|
39
|
+
it_should_behave_like(
|
40
|
+
'property that produces int operand by short circuiting relations')
|
41
|
+
end
|
42
|
+
|
43
|
+
describe Gecode::Int::Linear, ' (- property)' do
|
44
|
+
before do
|
45
|
+
@model = LinearPropertySampleProblem.new
|
46
|
+
@x = @model.x
|
47
|
+
@y = @model.y
|
48
|
+
@z = @model.z
|
49
|
+
|
50
|
+
# For int operand producing property spec.
|
51
|
+
@property_types = [:int, :int]
|
52
|
+
@select_property = lambda do |int1, int2|
|
53
|
+
int1 - int2
|
54
|
+
end
|
55
|
+
@selected_property = @x - @y
|
56
|
+
@constraint_class =
|
57
|
+
Gecode::Int::Linear::LinearRelationConstraint
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should constrain the difference' do
|
61
|
+
(@x - @y).must == 1
|
62
|
+
@model.solve!
|
63
|
+
(@x.value - @y.value).should == 1
|
64
|
+
end
|
65
|
+
|
66
|
+
it_should_behave_like(
|
67
|
+
'property that produces int operand by short circuiting relations')
|
68
|
+
end
|
69
|
+
|
70
|
+
describe Gecode::Int::Linear, ' (* property)' do
|
71
|
+
before do
|
72
|
+
@model = LinearPropertySampleProblem.new
|
73
|
+
@x = @model.x
|
74
|
+
@y = @model.y
|
75
|
+
@z = @model.z
|
76
|
+
|
77
|
+
# For int operand producing property spec.
|
78
|
+
@property_types = [:int]
|
79
|
+
@select_property = lambda do |int|
|
80
|
+
int * 17
|
81
|
+
end
|
82
|
+
@selected_property = @x * 2
|
83
|
+
@constraint_class =
|
84
|
+
Gecode::Int::Linear::LinearRelationConstraint
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'should constrain the value times a constant' do
|
88
|
+
(@x * 2).must == 4
|
89
|
+
@model.solve!
|
90
|
+
(@x.value * 2).should == 4
|
91
|
+
end
|
92
|
+
|
93
|
+
it_should_behave_like(
|
94
|
+
'property that produces int operand by short circuiting relations')
|
95
|
+
end
|
96
|
+
|
97
|
+
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../constraint_helper'
|
2
|
+
|
3
|
+
Gecode::Util::RELATION_TYPES.each_pair do |relation, rel_value|
|
4
|
+
describe Gecode::Int::Relation, " (#{relation} with int op)" do
|
5
|
+
before do
|
6
|
+
@model = Gecode::Model.new
|
7
|
+
|
8
|
+
# For constraint spec.
|
9
|
+
@types = [:int, :int]
|
10
|
+
@invoke = lambda do |receiver, op, hash|
|
11
|
+
receiver.method(relation).call(op, hash)
|
12
|
+
@model.solve!
|
13
|
+
end
|
14
|
+
@expect = lambda do |var1, var2, opts, reif_var|
|
15
|
+
if reif_var.nil?
|
16
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
17
|
+
an_instance_of(Gecode::Raw::Space),
|
18
|
+
var1, rel_value, var2, *opts)
|
19
|
+
else
|
20
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
21
|
+
an_instance_of(Gecode::Raw::Space),
|
22
|
+
var1, rel_value, var2, reif_var, *opts)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should constrain the #{relation} with an int operand" do
|
28
|
+
ints = @model.int_var_array(2, -5..5)
|
29
|
+
@model.branch_on ints
|
30
|
+
int1, int2 = ints
|
31
|
+
int1.must.method(relation).call(int2)
|
32
|
+
@model.solve!
|
33
|
+
int1.value.should.method(relation).call(int2.value)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should constrain the negated #{relation} with an int operand" do
|
37
|
+
ints = @model.int_var_array(2, -5..5)
|
38
|
+
@model.branch_on ints
|
39
|
+
int1, int2 = ints
|
40
|
+
int1.must_not.method(relation).call(int2)
|
41
|
+
@model.solve!
|
42
|
+
int1.value.should_not.method(relation).call(int2.value)
|
43
|
+
end
|
44
|
+
|
45
|
+
it_should_behave_like 'reifiable constraint'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
Gecode::Util::RELATION_TYPES.each_pair do |relation, rel_value|
|
50
|
+
describe Gecode::Int::Relation, " (#{relation} with fixnum)" do
|
51
|
+
before do
|
52
|
+
@model = Gecode::Model.new
|
53
|
+
|
54
|
+
# For constraint spec.
|
55
|
+
@types = [:int]
|
56
|
+
@invoke = lambda do |receiver, hash|
|
57
|
+
receiver.method(relation).call(17, hash)
|
58
|
+
@model.solve!
|
59
|
+
end
|
60
|
+
@expect = lambda do |var, opts, reif_var|
|
61
|
+
if reif_var.nil?
|
62
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
63
|
+
an_instance_of(Gecode::Raw::Space),
|
64
|
+
var, rel_value, 17, *opts)
|
65
|
+
else
|
66
|
+
Gecode::Raw.should_receive(:rel).once.with(
|
67
|
+
an_instance_of(Gecode::Raw::Space),
|
68
|
+
var, rel_value, 17, reif_var, *opts)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should constrain the #{relation} with a fixnum" do
|
74
|
+
int = @model.int_var(-5..5)
|
75
|
+
@model.branch_on int
|
76
|
+
int.must.method(relation).call(3)
|
77
|
+
@model.solve!
|
78
|
+
int.value.should.method(relation).call(3)
|
79
|
+
end
|
80
|
+
|
81
|
+
it_should_behave_like 'reifiable constraint'
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|