gecoder-with-gecode 0.8.3 → 0.9.0

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.
Files changed (337) hide show
  1. data/CHANGES +15 -0
  2. data/README +6 -2
  3. data/example/equation_system.rb +15 -0
  4. data/example/magic_sequence.rb +7 -7
  5. data/example/money.rb +36 -0
  6. data/example/queens.rb +7 -8
  7. data/example/send_most_money.rb +1 -1
  8. data/example/square_tiling.rb +2 -2
  9. data/example/sudoku-set.rb +11 -12
  10. data/example/sudoku.rb +40 -45
  11. data/ext/extconf.rb +0 -0
  12. data/ext/gecode-2.1.1/LICENSE +0 -0
  13. data/ext/gecode-2.1.1/configure +0 -0
  14. data/ext/gecode-2.1.1/contribs/qecode/SDFVariableHeuristic.cc +0 -0
  15. data/ext/gecode-2.1.1/contribs/qecode/SDFVariableHeuristic.hh +0 -0
  16. data/ext/gecode-2.1.1/contribs/qecode/configure +0 -0
  17. data/ext/gecode-2.1.1/contribs/qecode/extensivecomparator.cc +0 -0
  18. data/ext/gecode-2.1.1/contribs/qecode/extensivecomparator.hh +0 -0
  19. data/ext/gecode-2.1.1/contribs/qecode/heap.cc +0 -0
  20. data/ext/gecode-2.1.1/contribs/qecode/implicative.cc +0 -0
  21. data/ext/gecode-2.1.1/contribs/qecode/implicative.hh +0 -0
  22. data/ext/gecode-2.1.1/contribs/qecode/myspace.cc +0 -0
  23. data/ext/gecode-2.1.1/contribs/qecode/myspace.hh +0 -0
  24. data/ext/gecode-2.1.1/contribs/qecode/qecore.cc +0 -0
  25. data/ext/gecode-2.1.1/contribs/qecode/qecore.hh +0 -0
  26. data/ext/gecode-2.1.1/contribs/qecode/warner.cc +0 -0
  27. data/ext/gecode-2.1.1/contribs/qecode/warner.hh +0 -0
  28. data/ext/gecode-2.1.1/gecode/cpltset/var-imp/cpltset.vis +0 -0
  29. data/ext/gecode-2.1.1/gecode/int/arithmetic/abs.icc +0 -0
  30. data/ext/gecode-2.1.1/gecode/int/arithmetic/max.icc +0 -0
  31. data/ext/gecode-2.1.1/gecode/int/arithmetic/mult.icc +0 -0
  32. data/ext/gecode-2.1.1/gecode/int/arithmetic/sqr.icc +0 -0
  33. data/ext/gecode-2.1.1/gecode/int/arithmetic/sqrt.icc +0 -0
  34. data/ext/gecode-2.1.1/gecode/int/array.cc +0 -0
  35. data/ext/gecode-2.1.1/gecode/int/array.icc +0 -0
  36. data/ext/gecode-2.1.1/gecode/int/bool/base.icc +0 -0
  37. data/ext/gecode-2.1.1/gecode/int/bool/eq.icc +0 -0
  38. data/ext/gecode-2.1.1/gecode/int/bool/eqv.icc +0 -0
  39. data/ext/gecode-2.1.1/gecode/int/bool/lq.icc +0 -0
  40. data/ext/gecode-2.1.1/gecode/int/bool/or.icc +0 -0
  41. data/ext/gecode-2.1.1/gecode/int/branch/select-val.icc +0 -0
  42. data/ext/gecode-2.1.1/gecode/int/branch/select-view.icc +0 -0
  43. data/ext/gecode-2.1.1/gecode/int/branch.cc +0 -0
  44. data/ext/gecode-2.1.1/gecode/int/branch.hh +0 -0
  45. data/ext/gecode-2.1.1/gecode/int/channel/base.icc +0 -0
  46. data/ext/gecode-2.1.1/gecode/int/channel/dom.icc +0 -0
  47. data/ext/gecode-2.1.1/gecode/int/channel/link-multi.cc +0 -0
  48. data/ext/gecode-2.1.1/gecode/int/channel/link-multi.icc +0 -0
  49. data/ext/gecode-2.1.1/gecode/int/channel/link-single.cc +0 -0
  50. data/ext/gecode-2.1.1/gecode/int/channel/link-single.icc +0 -0
  51. data/ext/gecode-2.1.1/gecode/int/channel/val.icc +0 -0
  52. data/ext/gecode-2.1.1/gecode/int/channel.cc +0 -0
  53. data/ext/gecode-2.1.1/gecode/int/channel.hh +0 -0
  54. data/ext/gecode-2.1.1/gecode/int/circuit/base.icc +0 -0
  55. data/ext/gecode-2.1.1/gecode/int/circuit/dom.icc +0 -0
  56. data/ext/gecode-2.1.1/gecode/int/circuit/val.icc +0 -0
  57. data/ext/gecode-2.1.1/gecode/int/circuit.cc +0 -0
  58. data/ext/gecode-2.1.1/gecode/int/circuit.hh +0 -0
  59. data/ext/gecode-2.1.1/gecode/int/count/int.icc +0 -0
  60. data/ext/gecode-2.1.1/gecode/int/count/rel.icc +0 -0
  61. data/ext/gecode-2.1.1/gecode/int/count/view.icc +0 -0
  62. data/ext/gecode-2.1.1/gecode/int/distinct/bilink.icc +0 -0
  63. data/ext/gecode-2.1.1/gecode/int/distinct/bnd.icc +0 -0
  64. data/ext/gecode-2.1.1/gecode/int/distinct/combptr.icc +0 -0
  65. data/ext/gecode-2.1.1/gecode/int/distinct/dom.icc +0 -0
  66. data/ext/gecode-2.1.1/gecode/int/distinct/edge.icc +0 -0
  67. data/ext/gecode-2.1.1/gecode/int/distinct/node.icc +0 -0
  68. data/ext/gecode-2.1.1/gecode/int/distinct/ter-dom.icc +0 -0
  69. data/ext/gecode-2.1.1/gecode/int/distinct/val.icc +0 -0
  70. data/ext/gecode-2.1.1/gecode/int/dom/range.icc +0 -0
  71. data/ext/gecode-2.1.1/gecode/int/dom/spec.icc +0 -0
  72. data/ext/gecode-2.1.1/gecode/int/dom.cc +0 -0
  73. data/ext/gecode-2.1.1/gecode/int/dom.hh +0 -0
  74. data/ext/gecode-2.1.1/gecode/int/element/int.icc +0 -0
  75. data/ext/gecode-2.1.1/gecode/int/element/view.icc +0 -0
  76. data/ext/gecode-2.1.1/gecode/int/element.cc +0 -0
  77. data/ext/gecode-2.1.1/gecode/int/element.hh +0 -0
  78. data/ext/gecode-2.1.1/gecode/int/exception.icc +0 -0
  79. data/ext/gecode-2.1.1/gecode/int/extensional/dfa.cc +0 -0
  80. data/ext/gecode-2.1.1/gecode/int/extensional/dfa.icc +0 -0
  81. data/ext/gecode-2.1.1/gecode/int/extensional/layered-graph.icc +0 -0
  82. data/ext/gecode-2.1.1/gecode/int/gcc/dom.icc +0 -0
  83. data/ext/gecode-2.1.1/gecode/int/gcc/gccbndsup.icc +0 -0
  84. data/ext/gecode-2.1.1/gecode/int/gcc/lbc.icc +0 -0
  85. data/ext/gecode-2.1.1/gecode/int/gcc/ubc.icc +0 -0
  86. data/ext/gecode-2.1.1/gecode/int/gcc.cc +0 -0
  87. data/ext/gecode-2.1.1/gecode/int/gcc.hh +0 -0
  88. data/ext/gecode-2.1.1/gecode/int/int-set.cc +0 -0
  89. data/ext/gecode-2.1.1/gecode/int/int-set.icc +0 -0
  90. data/ext/gecode-2.1.1/gecode/int/linear/bool-int.icc +0 -0
  91. data/ext/gecode-2.1.1/gecode/int/linear/bool-post.cc +0 -0
  92. data/ext/gecode-2.1.1/gecode/int/linear/bool-scale.icc +0 -0
  93. data/ext/gecode-2.1.1/gecode/int/linear/bool-view.icc +0 -0
  94. data/ext/gecode-2.1.1/gecode/int/linear/int-bin.icc +0 -0
  95. data/ext/gecode-2.1.1/gecode/int/linear/int-dom.icc +0 -0
  96. data/ext/gecode-2.1.1/gecode/int/linear/int-nary.icc +0 -0
  97. data/ext/gecode-2.1.1/gecode/int/linear/int-post.cc +0 -0
  98. data/ext/gecode-2.1.1/gecode/int/linear/int-ter.icc +0 -0
  99. data/ext/gecode-2.1.1/gecode/int/linear/post.icc +0 -0
  100. data/ext/gecode-2.1.1/gecode/int/propagator.icc +0 -0
  101. data/ext/gecode-2.1.1/gecode/int/rel/eq.icc +0 -0
  102. data/ext/gecode-2.1.1/gecode/int/rel/lex.icc +0 -0
  103. data/ext/gecode-2.1.1/gecode/int/rel/lq-le.icc +0 -0
  104. data/ext/gecode-2.1.1/gecode/int/rel/nq.icc +0 -0
  105. data/ext/gecode-2.1.1/gecode/int/unshare.cc +0 -0
  106. data/ext/gecode-2.1.1/gecode/int/var/bool.cc +0 -0
  107. data/ext/gecode-2.1.1/gecode/int/var-imp/bool.cc +0 -0
  108. data/ext/gecode-2.1.1/gecode/int/var-imp/bool.icc +0 -0
  109. data/ext/gecode-2.1.1/gecode/int/var-imp/bool.vis +0 -0
  110. data/ext/gecode-2.1.1/gecode/int/var-imp/delta.icc +0 -0
  111. data/ext/gecode-2.1.1/gecode/int/var-imp/int.icc +0 -0
  112. data/ext/gecode-2.1.1/gecode/int/var-imp/int.vis +0 -0
  113. data/ext/gecode-2.1.1/gecode/int/view/bool.icc +0 -0
  114. data/ext/gecode-2.1.1/gecode/int/view/constint.icc +0 -0
  115. data/ext/gecode-2.1.1/gecode/int/view/int.icc +0 -0
  116. data/ext/gecode-2.1.1/gecode/int/view/iter.icc +0 -0
  117. data/ext/gecode-2.1.1/gecode/int/view/minus.icc +0 -0
  118. data/ext/gecode-2.1.1/gecode/int/view/offset.icc +0 -0
  119. data/ext/gecode-2.1.1/gecode/int/view/print.cc +0 -0
  120. data/ext/gecode-2.1.1/gecode/int/view/rtest.icc +0 -0
  121. data/ext/gecode-2.1.1/gecode/int/view/scale.icc +0 -0
  122. data/ext/gecode-2.1.1/gecode/int/view/zero.icc +0 -0
  123. data/ext/gecode-2.1.1/gecode/int/view.icc +0 -0
  124. data/ext/gecode-2.1.1/gecode/iter/ranges-add.icc +0 -0
  125. data/ext/gecode-2.1.1/gecode/iter/ranges-append.icc +0 -0
  126. data/ext/gecode-2.1.1/gecode/iter/ranges-array.icc +0 -0
  127. data/ext/gecode-2.1.1/gecode/iter/ranges-cache.icc +0 -0
  128. data/ext/gecode-2.1.1/gecode/iter/ranges-compl.icc +0 -0
  129. data/ext/gecode-2.1.1/gecode/iter/ranges-diff.icc +0 -0
  130. data/ext/gecode-2.1.1/gecode/iter/ranges-empty.icc +0 -0
  131. data/ext/gecode-2.1.1/gecode/iter/ranges-inter.icc +0 -0
  132. data/ext/gecode-2.1.1/gecode/iter/ranges-minmax.icc +0 -0
  133. data/ext/gecode-2.1.1/gecode/iter/ranges-minus.icc +0 -0
  134. data/ext/gecode-2.1.1/gecode/iter/ranges-offset.icc +0 -0
  135. data/ext/gecode-2.1.1/gecode/iter/ranges-operations.icc +0 -0
  136. data/ext/gecode-2.1.1/gecode/iter/ranges-scale.icc +0 -0
  137. data/ext/gecode-2.1.1/gecode/iter/ranges-singleton-append.icc +0 -0
  138. data/ext/gecode-2.1.1/gecode/iter/ranges-singleton.icc +0 -0
  139. data/ext/gecode-2.1.1/gecode/iter/ranges-union.icc +0 -0
  140. data/ext/gecode-2.1.1/gecode/iter/ranges-values.icc +0 -0
  141. data/ext/gecode-2.1.1/gecode/iter/values-array.icc +0 -0
  142. data/ext/gecode-2.1.1/gecode/iter/values-minus.icc +0 -0
  143. data/ext/gecode-2.1.1/gecode/iter/values-offset.icc +0 -0
  144. data/ext/gecode-2.1.1/gecode/iter/values-ranges.icc +0 -0
  145. data/ext/gecode-2.1.1/gecode/iter/values-singleton.icc +0 -0
  146. data/ext/gecode-2.1.1/gecode/iter/values-unique.icc +0 -0
  147. data/ext/gecode-2.1.1/gecode/iter.hh +0 -0
  148. data/ext/gecode-2.1.1/gecode/kernel/advisor.icc +0 -0
  149. data/ext/gecode-2.1.1/gecode/kernel/array.icc +0 -0
  150. data/ext/gecode-2.1.1/gecode/kernel/branching.icc +0 -0
  151. data/ext/gecode-2.1.1/gecode/kernel/exception.icc +0 -0
  152. data/ext/gecode-2.1.1/gecode/kernel/macros.icc +0 -0
  153. data/ext/gecode-2.1.1/gecode/kernel/memory-manager.icc +0 -0
  154. data/ext/gecode-2.1.1/gecode/kernel/modevent.icc +0 -0
  155. data/ext/gecode-2.1.1/gecode/kernel/propagator.icc +0 -0
  156. data/ext/gecode-2.1.1/gecode/kernel/shared-array.icc +0 -0
  157. data/ext/gecode-2.1.1/gecode/kernel/var-traits.icc +0 -0
  158. data/ext/gecode-2.1.1/gecode/kernel/var.icc +0 -0
  159. data/ext/gecode-2.1.1/gecode/kernel/view.icc +0 -0
  160. data/ext/gecode-2.1.1/gecode/kernel.hh +0 -0
  161. data/ext/gecode-2.1.1/gecode/minimodel/arithmetic.cc +0 -0
  162. data/ext/gecode-2.1.1/gecode/minimodel/bool-expr.cc +0 -0
  163. data/ext/gecode-2.1.1/gecode/minimodel/bool-expr.icc +0 -0
  164. data/ext/gecode-2.1.1/gecode/minimodel/bool-rel.icc +0 -0
  165. data/ext/gecode-2.1.1/gecode/minimodel/lin-expr.icc +0 -0
  166. data/ext/gecode-2.1.1/gecode/minimodel/lin-rel.icc +0 -0
  167. data/ext/gecode-2.1.1/gecode/minimodel/reg.cc +0 -0
  168. data/ext/gecode-2.1.1/gecode/minimodel.hh +0 -0
  169. data/ext/gecode-2.1.1/gecode/search/bab.cc +0 -0
  170. data/ext/gecode-2.1.1/gecode/search/bab.icc +0 -0
  171. data/ext/gecode-2.1.1/gecode/search/dfs.cc +0 -0
  172. data/ext/gecode-2.1.1/gecode/search/dfs.icc +0 -0
  173. data/ext/gecode-2.1.1/gecode/search/engine-ctrl.icc +0 -0
  174. data/ext/gecode-2.1.1/gecode/search/lds.cc +0 -0
  175. data/ext/gecode-2.1.1/gecode/search/lds.icc +0 -0
  176. data/ext/gecode-2.1.1/gecode/search/options.cc +0 -0
  177. data/ext/gecode-2.1.1/gecode/search/options.icc +0 -0
  178. data/ext/gecode-2.1.1/gecode/search/reco-stack.icc +0 -0
  179. data/ext/gecode-2.1.1/gecode/search/restart.icc +0 -0
  180. data/ext/gecode-2.1.1/gecode/search/statistics.icc +0 -0
  181. data/ext/gecode-2.1.1/gecode/search/stop.cc +0 -0
  182. data/ext/gecode-2.1.1/gecode/search/stop.icc +0 -0
  183. data/ext/gecode-2.1.1/gecode/set/var-imp/set.vis +0 -0
  184. data/ext/gecode-2.1.1/gecode/support/block-allocator.icc +0 -0
  185. data/ext/gecode-2.1.1/gecode/support/cast.icc +0 -0
  186. data/ext/gecode-2.1.1/gecode/support/exception.cc +0 -0
  187. data/ext/gecode-2.1.1/gecode/support/exception.icc +0 -0
  188. data/ext/gecode-2.1.1/gecode/support/macros.icc +0 -0
  189. data/ext/gecode-2.1.1/gecode/support/marked-pointer.icc +0 -0
  190. data/ext/gecode-2.1.1/gecode/support/memory.icc +0 -0
  191. data/ext/gecode-2.1.1/gecode/support/sentinel-stack.icc +0 -0
  192. data/ext/gecode-2.1.1/gecode/support/static-stack.icc +0 -0
  193. data/ext/gecode-2.1.1/gecode/support/symbol.cc +0 -0
  194. data/ext/gecode-2.1.1/gecode/support.hh +0 -0
  195. data/ext/gecode-2.1.1/install-sh +0 -0
  196. data/ext/gecode-2.1.1/misc/debian/rules +0 -0
  197. data/ext/gecode-2.1.1/misc/doxygen/back.png +0 -0
  198. data/ext/gecode-2.1.1/misc/doxygen/gecode-logo-100.png +0 -0
  199. data/ext/gecode-2.1.1/misc/genchangelog.perl +0 -0
  200. data/ext/gecode-2.1.1/misc/genlicense.perl +0 -0
  201. data/ext/gecode-2.1.1/misc/genstatistics.perl +0 -0
  202. data/ext/gecode-2.1.1/misc/genvariables.perl +0 -0
  203. data/ext/gecode-2.1.1/misc/getrevision.perl +0 -0
  204. data/ext/gecode-2.1.1/misc/makedepend.perl +0 -0
  205. data/ext/gecode-2.1.1/misc/svn-ignore.txt +0 -0
  206. data/ext/gecode-2.1.1/variables.vsl +0 -0
  207. data/lib/gecoder/bindings/bindings.rb +16 -0
  208. data/lib/gecoder/bindings.rb +42 -0
  209. data/lib/gecoder/interface/branch.rb +16 -9
  210. data/lib/gecoder/interface/constraints/bool/boolean.rb +205 -213
  211. data/lib/gecoder/interface/constraints/bool/channel.rb +4 -5
  212. data/lib/gecoder/interface/constraints/bool/linear.rb +192 -21
  213. data/lib/gecoder/interface/constraints/bool_enum/channel.rb +43 -39
  214. data/lib/gecoder/interface/constraints/bool_enum/extensional.rb +43 -49
  215. data/lib/gecoder/interface/constraints/bool_enum/relation.rb +38 -71
  216. data/lib/gecoder/interface/constraints/bool_enum_constraints.rb +73 -22
  217. data/lib/gecoder/interface/constraints/bool_var_constraints.rb +140 -61
  218. data/lib/gecoder/interface/constraints/extensional_regexp.rb +4 -4
  219. data/lib/gecoder/interface/constraints/fixnum_enum/element.rb +63 -0
  220. data/lib/gecoder/interface/constraints/fixnum_enum/operation.rb +65 -0
  221. data/lib/gecoder/interface/constraints/fixnum_enum_constraints.rb +42 -0
  222. data/lib/gecoder/interface/constraints/int/arithmetic.rb +131 -130
  223. data/lib/gecoder/interface/constraints/int/channel.rb +21 -31
  224. data/lib/gecoder/interface/constraints/int/domain.rb +45 -42
  225. data/lib/gecoder/interface/constraints/int/linear.rb +85 -239
  226. data/lib/gecoder/interface/constraints/int/relation.rb +141 -0
  227. data/lib/gecoder/interface/constraints/int_enum/arithmetic.rb +55 -64
  228. data/lib/gecoder/interface/constraints/int_enum/channel.rb +35 -37
  229. data/lib/gecoder/interface/constraints/int_enum/count.rb +53 -78
  230. data/lib/gecoder/interface/constraints/int_enum/distinct.rb +36 -46
  231. data/lib/gecoder/interface/constraints/int_enum/element.rb +39 -57
  232. data/lib/gecoder/interface/constraints/int_enum/equality.rb +15 -19
  233. data/lib/gecoder/interface/constraints/int_enum/extensional.rb +65 -72
  234. data/lib/gecoder/interface/constraints/int_enum/sort.rb +42 -45
  235. data/lib/gecoder/interface/constraints/int_enum_constraints.rb +79 -22
  236. data/lib/gecoder/interface/constraints/int_var_constraints.rb +215 -44
  237. data/lib/gecoder/interface/constraints/reifiable_constraints.rb +14 -14
  238. data/lib/gecoder/interface/constraints/selected_set/select.rb +120 -0
  239. data/lib/gecoder/interface/constraints/selected_set_constraints.rb +75 -0
  240. data/lib/gecoder/interface/constraints/set/cardinality.rb +43 -53
  241. data/lib/gecoder/interface/constraints/set/channel.rb +26 -29
  242. data/lib/gecoder/interface/constraints/set/connection.rb +89 -152
  243. data/lib/gecoder/interface/constraints/set/domain.rb +112 -65
  244. data/lib/gecoder/interface/constraints/set/include.rb +36 -0
  245. data/lib/gecoder/interface/constraints/set/operation.rb +96 -110
  246. data/lib/gecoder/interface/constraints/set/relation.rb +114 -137
  247. data/lib/gecoder/interface/constraints/set_elements/relation.rb +116 -0
  248. data/lib/gecoder/interface/constraints/set_elements_constraints.rb +97 -0
  249. data/lib/gecoder/interface/constraints/set_enum/channel.rb +23 -27
  250. data/lib/gecoder/interface/constraints/set_enum/distinct.rb +18 -19
  251. data/lib/gecoder/interface/constraints/set_enum/operation.rb +62 -53
  252. data/lib/gecoder/interface/constraints/set_enum/select.rb +79 -0
  253. data/lib/gecoder/interface/constraints/set_enum_constraints.rb +73 -23
  254. data/lib/gecoder/interface/constraints/set_var_constraints.rb +222 -57
  255. data/lib/gecoder/interface/constraints.rb +410 -451
  256. data/lib/gecoder/interface/enum_matrix.rb +4 -4
  257. data/lib/gecoder/interface/enum_wrapper.rb +71 -22
  258. data/lib/gecoder/interface/model.rb +167 -12
  259. data/lib/gecoder/interface/model_sugar.rb +84 -0
  260. data/lib/gecoder/interface/search.rb +30 -18
  261. data/lib/gecoder/interface/variables.rb +103 -33
  262. data/lib/gecoder/interface.rb +2 -1
  263. data/lib/gecoder/version.rb +2 -2
  264. data/specs/bool_var.rb +19 -12
  265. data/specs/constraints/{boolean.rb → bool/boolean.rb} +103 -28
  266. data/specs/constraints/bool/boolean_properties.rb +51 -0
  267. data/specs/constraints/bool/linear.rb +213 -0
  268. data/specs/constraints/bool_enum/bool_enum_relation.rb +117 -0
  269. data/specs/constraints/bool_enum/channel.rb +102 -0
  270. data/specs/constraints/{extensional.rb → bool_enum/extensional.rb} +32 -101
  271. data/specs/constraints/constraint_helper.rb +149 -179
  272. data/specs/constraints/constraint_receivers.rb +103 -0
  273. data/specs/constraints/constraints.rb +6 -63
  274. data/specs/constraints/fixnum_enum/element.rb +58 -0
  275. data/specs/constraints/fixnum_enum/operation.rb +67 -0
  276. data/specs/constraints/int/arithmetic.rb +149 -0
  277. data/specs/constraints/int/channel.rb +101 -0
  278. data/specs/constraints/int/domain.rb +106 -0
  279. data/specs/constraints/int/linear.rb +183 -0
  280. data/specs/constraints/int/linear_properties.rb +97 -0
  281. data/specs/constraints/int/relation.rb +84 -0
  282. data/specs/constraints/int_enum/arithmetic.rb +72 -0
  283. data/specs/constraints/int_enum/channel.rb +57 -0
  284. data/specs/constraints/int_enum/count.rb +72 -0
  285. data/specs/constraints/int_enum/distinct.rb +80 -0
  286. data/specs/constraints/int_enum/element.rb +61 -0
  287. data/specs/constraints/int_enum/equality.rb +29 -0
  288. data/specs/constraints/int_enum/extensional.rb +224 -0
  289. data/specs/constraints/int_enum/sort.rb +167 -0
  290. data/specs/constraints/operands.rb +264 -0
  291. data/specs/constraints/property_helper.rb +443 -0
  292. data/specs/constraints/reification_sugar.rb +4 -5
  293. data/specs/constraints/selected_set/select.rb +56 -0
  294. data/specs/constraints/selected_set/select_properties.rb +157 -0
  295. data/specs/constraints/set/cardinality.rb +58 -0
  296. data/specs/constraints/set/cardinality_properties.rb +46 -0
  297. data/specs/constraints/set/channel.rb +77 -0
  298. data/specs/constraints/set/connection.rb +176 -0
  299. data/specs/constraints/set/domain.rb +197 -0
  300. data/specs/constraints/set/include.rb +36 -0
  301. data/specs/constraints/set/operation.rb +132 -0
  302. data/specs/constraints/set/relation.rb +117 -0
  303. data/specs/constraints/set_elements/relation.rb +84 -0
  304. data/specs/constraints/set_enum/channel.rb +80 -0
  305. data/specs/constraints/set_enum/distinct.rb +59 -0
  306. data/specs/constraints/set_enum/operation.rb +111 -0
  307. data/specs/constraints/set_enum/select.rb +73 -0
  308. data/specs/enum_wrapper.rb +53 -3
  309. data/specs/int_var.rb +44 -25
  310. data/specs/model.rb +58 -1
  311. data/specs/model_sugar.rb +30 -0
  312. data/specs/search.rb +24 -5
  313. data/specs/selected_set.rb +39 -0
  314. data/specs/set_elements.rb +34 -0
  315. data/specs/set_var.rb +22 -8
  316. data/specs/spec_helper.rb +206 -6
  317. data/tasks/distribution.rake +22 -7
  318. data/tasks/svn.rake +3 -1
  319. metadata +219 -135
  320. data/lib/gecoder/interface/constraints/set_enum/selection.rb +0 -217
  321. data/specs/constraints/arithmetic.rb +0 -351
  322. data/specs/constraints/bool_enum_relation.rb +0 -160
  323. data/specs/constraints/cardinality.rb +0 -157
  324. data/specs/constraints/channel.rb +0 -454
  325. data/specs/constraints/connection.rb +0 -369
  326. data/specs/constraints/count.rb +0 -146
  327. data/specs/constraints/distinct.rb +0 -164
  328. data/specs/constraints/element.rb +0 -108
  329. data/specs/constraints/equality.rb +0 -31
  330. data/specs/constraints/int_domain.rb +0 -70
  331. data/specs/constraints/int_relation.rb +0 -82
  332. data/specs/constraints/linear.rb +0 -340
  333. data/specs/constraints/selection.rb +0 -292
  334. data/specs/constraints/set_domain.rb +0 -185
  335. data/specs/constraints/set_operation.rb +0 -285
  336. data/specs/constraints/set_relation.rb +0 -197
  337. data/specs/constraints/sort.rb +0 -179
@@ -0,0 +1,58 @@
1
+ require File.dirname(__FILE__) + '/../constraint_helper'
2
+
3
+ describe Gecode::Set::Cardinality, ' (constraint)' do
4
+ before do
5
+ @model = Gecode::Model.new
6
+ @set = @model.set_var([], 0..10)
7
+ @model.branch_on @model.wrap_enum([@set])
8
+ @range = 1..2
9
+ @three_dot_range = 1...2
10
+
11
+ @invoke = lambda do |rhs|
12
+ @set.size.must_be.in(rhs)
13
+ @model.solve!
14
+ end
15
+ @expect = lambda do |rhs|
16
+ @model.allow_space_access do
17
+ Gecode::Raw.should_receive(:cardinality).once.with(
18
+ an_instance_of(Gecode::Raw::Space),
19
+ an_instance_of(Gecode::Raw::SetVar), rhs.first, rhs.last)
20
+ end
21
+ end
22
+ end
23
+
24
+ it 'should translate cardinality constraints with ranges' do
25
+ @expect.call(@range)
26
+ @invoke.call(@range)
27
+ end
28
+
29
+ it 'should translate cardinality constraints with three dot range domains' do
30
+ @expect.call(@three_dot_range)
31
+ @invoke.call(@three_dot_range)
32
+ end
33
+
34
+ it 'should constrain the cardinality of a set' do
35
+ @set.size.must_be.in @range
36
+ @model.solve!
37
+ @range.should include(@set.value.size)
38
+ end
39
+
40
+ it 'should raise error if the right hand side is not a range' do
41
+ lambda{ @set.size.must_be.in 'hello' }.should raise_error(TypeError)
42
+ end
43
+
44
+ it 'should not shadow the integer variable domain constrain' do
45
+ Gecode::Raw.should_receive(:dom).with(
46
+ an_instance_of(Gecode::Raw::Space),
47
+ an_instance_of(Gecode::Raw::IntVar), 0, 11, Gecode::Raw::ICL_DEF,
48
+ Gecode::Raw::PK_DEF)
49
+ Gecode::Raw.should_receive(:dom).with(
50
+ an_instance_of(Gecode::Raw::Space),
51
+ an_instance_of(Gecode::Raw::IntVar), an_instance_of(Gecode::Raw::IntSet),
52
+ an_instance_of(Gecode::Raw::BoolVar), Gecode::Raw::ICL_DEF,
53
+ Gecode::Raw::PK_DEF)
54
+ @set.size.must_not_be.in [1,3]
55
+ @model.solve!
56
+ end
57
+ end
58
+
@@ -0,0 +1,46 @@
1
+ require File.dirname(__FILE__) + '/../property_helper'
2
+
3
+ describe Gecode::Set::Cardinality, ' (property)' do
4
+ before do
5
+ @model = Gecode::Model.new
6
+ @set = @model.set_var([], 0..10)
7
+ @var = @model.int_var(0..11)
8
+ @model.branch_on @set
9
+ @model.branch_on @var
10
+
11
+ @property_types = [:set]
12
+ @select_property = lambda do |set|
13
+ set.size
14
+ end
15
+ @selected_property = @set.size
16
+ @constraint_class = Gecode::BlockConstraint
17
+ end
18
+
19
+ it 'should constrain the cardinality of a set' do
20
+ @set.size.must == @var
21
+ @model.solve!
22
+ @set.value.size.should == @var.value
23
+ end
24
+
25
+ it 'should constrain the cardinality of a set (2)' do
26
+ @set.size.must == 2
27
+ @model.solve!.should_not be_nil
28
+ @set.value.size.should == 2
29
+ end
30
+
31
+ it 'should constrain the cardinality of a set (3)' do
32
+ @set.size.must == @var
33
+ @var.must == 2
34
+ @model.solve!
35
+ @set.value.size.should == 2
36
+ end
37
+
38
+ it 'should translate into a cardinality constraint' do
39
+ Gecode::Raw.should_receive(:cardinality)
40
+ @set.size.must == @var
41
+ @model.solve!
42
+ end
43
+
44
+ it_should_behave_like(
45
+ 'property that produces int operand by short circuiting equality')
46
+ end
@@ -0,0 +1,77 @@
1
+ require File.dirname(__FILE__) + '/../constraint_helper'
2
+
3
+ class SetChannelSampleProblem < Gecode::Model
4
+ attr :bool_enum
5
+ attr :set
6
+
7
+ def initialize
8
+ @bool_enum = bool_var_array(4)
9
+ @set = set_var([], 0..3)
10
+
11
+ branch_on @bool_enum
12
+ end
13
+ end
14
+
15
+ describe Gecode::Set::Channel, ' (set variable as lhs with bool enum)' do
16
+ before do
17
+ @model = SetChannelSampleProblem.new
18
+ @bools = @model.bool_enum
19
+ @set = @model.set
20
+
21
+ @types = [:set, :bool_enum]
22
+ @invoke = lambda do |receiver, bool_enum, hash|
23
+ receiver.channel(bool_enum, hash)
24
+ @model.solve!
25
+ end
26
+ @expect = lambda do |var1, var2, opts, reif_var|
27
+ Gecode::Raw.should_receive(:channel).once.with(
28
+ an_instance_of(Gecode::Raw::Space),
29
+ var1, var2)
30
+ end
31
+ end
32
+
33
+ it 'should channel the bool enum with the set variable' do
34
+ @set.must_be.superset_of [0, 2]
35
+ @set.must.channel @bools
36
+ @model.solve!.should_not be_nil
37
+ set_values = @set.value
38
+ @bools.values.each_with_index do |bool, index|
39
+ bool.should == set_values.include?(index)
40
+ end
41
+ end
42
+
43
+ it_should_behave_like 'non-reifiable set constraint'
44
+ it_should_behave_like 'non-negatable constraint'
45
+ end
46
+
47
+ describe Gecode::Set::Channel, ' (bool enum as lhs with set variable)' do
48
+ before do
49
+ @model = SetChannelSampleProblem.new
50
+ @bools = @model.bool_enum
51
+ @set = @model.set
52
+
53
+ @types = [:bool_enum, :set]
54
+ @invoke = lambda do |receiver, set, hash|
55
+ receiver.channel(set, hash)
56
+ @model.solve!
57
+ end
58
+ @expect = lambda do |var1, var2, opts, reif_var|
59
+ Gecode::Raw.should_receive(:channel).once.with(
60
+ an_instance_of(Gecode::Raw::Space),
61
+ var1, var2)
62
+ end
63
+ end
64
+
65
+ it 'should channel the bool enum with the set variable' do
66
+ @set.must_be.superset_of [0, 2]
67
+ @bools.must.channel @set
68
+ @model.solve!.should_not be_nil
69
+ set_values = @set.value
70
+ @bools.values.each_with_index do |bool, index|
71
+ bool.should == set_values.include?(index)
72
+ end
73
+ end
74
+
75
+ it_should_behave_like 'non-reifiable set constraint'
76
+ it_should_behave_like 'non-negatable constraint'
77
+ end
@@ -0,0 +1,176 @@
1
+ require File.dirname(__FILE__) + '/../property_helper'
2
+
3
+ describe Gecode::Set::Connection, ' (min)' do
4
+ before do
5
+ @model = Gecode::Model.new
6
+ @set = @model.set_var([], 0..9)
7
+ @var = @model.int_var(0..10)
8
+ @model.branch_on @model.wrap_enum([@set])
9
+
10
+ @property_types = [:set]
11
+ @select_property = lambda do |set|
12
+ set.min
13
+ end
14
+ @selected_property = @set.min
15
+ @constraint_class = Gecode::BlockConstraint
16
+ end
17
+
18
+ it 'should constrain the min of a set' do
19
+ @set.min.must == 3
20
+ @model.solve!
21
+ @set.lower_bound.min.should == 3
22
+ end
23
+
24
+ it 'should translate into a min constraint' do
25
+ Gecode::Raw.should_receive(:min)
26
+ @set.min.must == 5
27
+ @model.solve!
28
+ end
29
+
30
+ it_should_behave_like(
31
+ 'property that produces int operand by short circuiting equality')
32
+ end
33
+
34
+ describe Gecode::Set::Connection, ' (max)' do
35
+ before do
36
+ @model = Gecode::Model.new
37
+ @set = @model.set_var([], 0..9)
38
+ @var = @model.int_var(0..10)
39
+ @model.branch_on @model.wrap_enum([@set])
40
+
41
+ @property_types = [:set]
42
+ @select_property = lambda do |set|
43
+ set.max
44
+ end
45
+ @selected_property = @set.max
46
+ @constraint_class = Gecode::BlockConstraint
47
+ end
48
+
49
+ it 'should constrain the max of a set' do
50
+ @set.max.must == 3
51
+ @model.solve!
52
+ @set.lower_bound.max.should == 3
53
+ end
54
+
55
+ it 'should translate into a max constraint' do
56
+ Gecode::Raw.should_receive(:max)
57
+ @set.max.must == 5
58
+ @model.solve!
59
+ end
60
+
61
+ it_should_behave_like(
62
+ 'property that produces int operand by short circuiting equality')
63
+ end
64
+
65
+ describe Gecode::Set::Connection, ' (sum)' do
66
+ before do
67
+ @model = Gecode::Model.new
68
+ @set = @model.set_var([], 0..9)
69
+ @target = @var = @model.int_var(0..20)
70
+ @model.branch_on @model.wrap_enum([@set])
71
+
72
+ @property_types = [:set]
73
+ @select_property = lambda do |set|
74
+ set.sum
75
+ end
76
+ @selected_property = @set.sum
77
+ @constraint_class = Gecode::BlockConstraint
78
+ end
79
+
80
+ it 'should constrain the sum of a set' do
81
+ @set.sum.must == 7
82
+ @model.solve!.should_not be_nil
83
+ @set.value.inject(0){ |x, y| x + y }.should == 7
84
+ end
85
+
86
+ it 'should translate into a weights constraint' do
87
+ Gecode::Raw.should_receive(:weights)
88
+ @set.sum.must == 5
89
+ @model.solve!
90
+ end
91
+
92
+ it 'should raise error if unsupported options is given' do
93
+ lambda do
94
+ @set.sum(:does_not_exist => :foo).must == @var
95
+ end.should raise_error(ArgumentError)
96
+ end
97
+
98
+ it 'should raise error if multiple options are given' do
99
+ lambda do
100
+ @set.sum(:weights => {}, :substitutions => {}).must == @var
101
+ end.should raise_error(ArgumentError)
102
+ end
103
+
104
+ it_should_behave_like(
105
+ 'property that produces int operand by short circuiting equality')
106
+ end
107
+
108
+ describe Gecode::Set::Connection, ' (sum with weights)' do
109
+ before do
110
+ @model = Gecode::Model.new
111
+ @set = @model.set_var([], 0..9)
112
+ @target = @var = @model.int_var(-20..20)
113
+ @model.branch_on @model.wrap_enum([@set])
114
+ @weights = Hash[*(0..9).zip((-9..-0).to_a.reverse).flatten]
115
+
116
+ @property_types = [:set]
117
+ @select_property = lambda do |set|
118
+ set.sum(:weights => @weights)
119
+ end
120
+ @selected_property = @set.sum(:weights => @weights)
121
+ @constraint_class = Gecode::BlockConstraint
122
+ end
123
+
124
+ it 'should constrain the sum of a set' do
125
+ @set.sum(:weights => @weights).must_be.in(-10..-1)
126
+ @model.solve!.should_not be_nil
127
+ weighted_sum = @set.value.inject(0){ |sum, x| sum - x**2 }
128
+ weighted_sum.should >= -10
129
+ weighted_sum.should <= -1
130
+ end
131
+
132
+ it 'should remove any elements not in the weight hash' do
133
+ @set.must_be.superset_of 0
134
+ @set.sum(:weights => {}).must_be == 0
135
+ lambda do
136
+ @model.solve!
137
+ end.should raise_error(Gecode::NoSolutionError)
138
+ end
139
+
140
+ it_should_behave_like(
141
+ 'property that produces int operand by short circuiting equality')
142
+ end
143
+
144
+ describe Gecode::Set::Connection, ' (sum with substitutions)' do
145
+ before do
146
+ @model = Gecode::Model.new
147
+ @set = @model.set_var([], 0..9)
148
+ @target = @var = @model.int_var(-20..20)
149
+ @model.branch_on @model.wrap_enum([@set])
150
+ @subs = Hash[*(0..9).zip((-9..-0).to_a.reverse).flatten]
151
+
152
+ @property_types = [:set]
153
+ @select_property = lambda do |set|
154
+ set.sum(:substitutions => @subs)
155
+ end
156
+ @selected_property = @set.sum(:substitutions => @subs)
157
+ @constraint_class = Gecode::BlockConstraint
158
+ end
159
+
160
+ it 'should constrain the sum of a set' do
161
+ @set.sum(:substitutions => @subs).must_be.in(-10..-1)
162
+ @model.solve!.should_not be_nil
163
+ substituted_sum = @set.value.inject{ |sum, x| sum + @subs[x] }
164
+ substituted_sum.should >= -10
165
+ substituted_sum.should <= -1
166
+ end
167
+
168
+ it 'should not be allowed together with :weights option' do
169
+ lambda do
170
+ @set.sum(:substitutions => @subs, :weights => [1]*20).must_be.in(-10..-1)
171
+ end.should raise_error(ArgumentError)
172
+ end
173
+
174
+ it_should_behave_like(
175
+ 'property that produces int operand by short circuiting equality')
176
+ end
@@ -0,0 +1,197 @@
1
+ require File.dirname(__FILE__) + '/../constraint_helper'
2
+
3
+ Gecode::Util::SET_RELATION_TYPES.each_pair do |relation, type|
4
+ next if relation == :==
5
+
6
+ describe Gecode::Set::Domain, " (#{relation})" do
7
+ include GecodeR::Specs::SetHelper
8
+
9
+ before do
10
+ @model = Gecode::Model.new
11
+ @glb = []
12
+ @lub = 0..3
13
+ @set = @model.set_var(@glb, @lub)
14
+ @model.branch_on @set
15
+ @range = 0..1
16
+ @non_range = [0, 2]
17
+ @singleton = 0
18
+
19
+ @types = [:set]
20
+ @invoke = lambda do |receiver, hash|
21
+ receiver.method(relation).call(@non_range, hash)
22
+ @model.solve!
23
+ end
24
+ @expect = lambda do |var, opts, reif_var|
25
+ @expect_with_rhs.call(var, opts, reif_var, @non_range)
26
+ end
27
+ @expect_with_rhs = lambda do |var, opts, reif_var, rhs|
28
+ if reif_var.nil?
29
+ Gecode::Raw.should_receive(:dom).once.with(
30
+ an_instance_of(Gecode::Raw::Space),
31
+ var, type,
32
+ *expect_constant_set(rhs))
33
+ else
34
+ params = [an_instance_of(Gecode::Raw::Space),
35
+ var, type]
36
+ params << expect_constant_set(rhs)
37
+ params << reif_var
38
+ Gecode::Raw.should_receive(:dom).once.with(*params.flatten)
39
+ end
40
+ end
41
+ end
42
+
43
+ it "should translate #{relation} with constant range to domain constraint" do
44
+ @expect_with_rhs.call(@model.allow_space_access{ @set.bind },
45
+ nil, nil, @range)
46
+ @set.must.send(relation, @range)
47
+ @model.solve!
48
+ end
49
+
50
+ it "should translate #{relation} with constant non-range to domain constraint" do
51
+ @expect_with_rhs.call(@model.allow_space_access{ @set.bind },
52
+ nil, nil, @non_range)
53
+ @set.must.send(relation, @non_range)
54
+ @model.solve!
55
+ end
56
+
57
+ it "should translate #{relation} with constant singleton to domain constraint" do
58
+ @expect_with_rhs.call(@model.allow_space_access{ @set.bind },
59
+ nil, nil, @singleton)
60
+ @set.must.send(relation, @singleton)
61
+ @model.solve!
62
+ end
63
+
64
+ it 'should raise error if the right hand side is not a constant set' do
65
+ lambda do
66
+ @set.must.send(relation, 'not a constant set')
67
+ end.should raise_error(TypeError)
68
+ end
69
+
70
+ it "should constrain the domain when #{relation} is used" do
71
+ @set = @model.set_var if relation == :complement
72
+ @set.must.method(relation).call(@non_range)
73
+ @model.solve!
74
+ @set.should be_assigned
75
+ case relation
76
+ when :superset
77
+ (@non_range - @set.value.to_a).should be_empty
78
+ when :subset
79
+ (@set.value.to_a - @non_range).should be_empty
80
+ when :complement
81
+ val = @set.value
82
+ val.min.should == Gecode::Model::SET_MIN_INT
83
+ val.max.should == Gecode::Model::SET_MAX_INT
84
+ @non_range.each do |element|
85
+ @set.not_in_upper_bound?(element).should be_true
86
+ end
87
+ when :disjoint
88
+ (@non_range & @set.value.to_a).should be_empty
89
+ end
90
+ end
91
+
92
+ it "should constrain the domain when negated #{relation} is used" do
93
+ @set.must_not.method(relation).call(@non_range)
94
+ @model.solve!
95
+ @set.should be_assigned
96
+ case relation
97
+ when :superset
98
+ (@non_range - @set.value.to_a).should_not be_empty
99
+ when :subset
100
+ (@set.value.to_a - @non_range).should_not be_empty
101
+ when :complement
102
+ val = @set.value
103
+ ((val.min != Gecode::Model::SET_MIN_INT) ||
104
+ (val.max != Gecode::Model::SET_MAX_INT) ||
105
+ @non_range.any?{ |element| @set.in_lower_bound?(element) }
106
+ ).should be_true
107
+ when :disjoint
108
+ (@non_range & @set.value.to_a).should_not be_empty
109
+ end
110
+ end
111
+
112
+ it_should_behave_like 'reifiable set constraint'
113
+ end
114
+ end
115
+
116
+ describe Gecode::Set::Domain, ' (equality)' do
117
+ include GecodeR::Specs::SetHelper
118
+
119
+ before do
120
+ @model = Gecode::Model.new
121
+ @glb = [0]
122
+ @lub = 0..3
123
+ @set = @model.set_var(@glb, @lub)
124
+ @range = 0..1
125
+ @non_range = [0, 2]
126
+ @singleton = 0
127
+ @model.branch_on @model.wrap_enum([@set])
128
+
129
+ @types = [:set]
130
+ @invoke = lambda do |receiver, hash|
131
+ receiver.equal(@non_range, hash)
132
+ @model.solve!
133
+ end
134
+ @expect = lambda do |var, opts, reif_var|
135
+ @expect_with_rhs.call(var, opts, reif_var, @non_range)
136
+ end
137
+ @expect_with_rhs = lambda do |var, opts, reif_var, rhs|
138
+ if reif_var.nil?
139
+ Gecode::Raw.should_receive(:dom).once.with(
140
+ an_instance_of(Gecode::Raw::Space),
141
+ var, Gecode::Raw::SRT_EQ,
142
+ *expect_constant_set(rhs))
143
+ else
144
+ params = [an_instance_of(Gecode::Raw::Space),
145
+ var, Gecode::Raw::SRT_EQ]
146
+ params << expect_constant_set(rhs)
147
+ params << reif_var
148
+ Gecode::Raw.should_receive(:dom).once.with(*params.flatten)
149
+ end
150
+ end
151
+ end
152
+
153
+ it 'should translate equality with constant range to domain constraint' do
154
+ @expect_with_rhs.call(@model.allow_space_access{ @set.bind },
155
+ nil, nil, @range)
156
+ @set.must == @range
157
+ @model.solve!
158
+ end
159
+
160
+ it 'should translate equality with constant non-range to domain constraint' do
161
+ @expect_with_rhs.call(@model.allow_space_access{ @set.bind },
162
+ nil, nil, @non_range)
163
+ @set.must == @non_range
164
+ @model.solve!
165
+ end
166
+
167
+ it 'should translate equality with constant singleton to domain constraint' do
168
+ @expect_with_rhs.call(@model.allow_space_access{ @set.bind },
169
+ nil, nil, @singleton)
170
+ @set.must == @singleton
171
+ @model.solve!
172
+ end
173
+
174
+ it 'should constrain the domain with equality' do
175
+ @set.must == @singleton
176
+ @model.solve!
177
+ @set.should be_assigned
178
+ @set.value.should include(@singleton)
179
+ @set.value.size.should == 1
180
+ end
181
+
182
+ it 'should constrain the domain with inequality' do
183
+ @set.must_not == @singleton
184
+ @model.solve!
185
+ @set.should be_assigned
186
+ @set.value.should include(@singleton)
187
+ ((@set.value.size > 1) || (@set.value != [@singleton])).should be_true
188
+ end
189
+
190
+ it 'should raise error if the right hand side is not a constant set' do
191
+ lambda do
192
+ @set.must == 'not a constant set'
193
+ end.should raise_error(TypeError)
194
+ end
195
+
196
+ it_should_behave_like 'reifiable set constraint'
197
+ end
@@ -0,0 +1,36 @@
1
+ require File.dirname(__FILE__) + '/../constraint_helper'
2
+
3
+ describe Gecode::Set::Connection, ' (include)' do
4
+ before do
5
+ @model = Gecode::Model.new
6
+ @set = @model.set_var([], 2..5)
7
+ @array = @model.int_var_array(4, 0..9)
8
+ @array.must_be.distinct
9
+ @model.branch_on @array
10
+ #@model.branch_on @model.wrap_enum([@set])
11
+
12
+ @types = [:set, :int_enum]
13
+ @invoke = lambda do |receiver, int_enum, hash|
14
+ if hash.empty?
15
+ receiver.include(int_enum)
16
+ else
17
+ receiver.include(int_enum, hash)
18
+ end
19
+ @model.solve!
20
+ end
21
+ @expect = lambda do |var1, var2, opts, reif_var|
22
+ Gecode::Raw.should_receive(:match).once.with(
23
+ an_instance_of(Gecode::Raw::Space),
24
+ var1, var2)
25
+ end
26
+ end
27
+
28
+ it 'should constrain the variables to be included in the set' do
29
+ @set.must.include @array
30
+ @model.solve!.should_not be_nil
31
+ @array.all?{ |x| @set.lower_bound.include? x.value }.should be_true
32
+ end
33
+
34
+ it_should_behave_like 'non-reifiable set constraint'
35
+ it_should_behave_like 'non-negatable constraint'
36
+ end