gecoder-with-gecode 0.9.0 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (919) hide show
  1. data/CHANGES +6 -0
  2. data/README +1 -1
  3. data/THANKS +18 -0
  4. data/example/equation_system.rb +3 -1
  5. data/example/magic_sequence.rb +3 -1
  6. data/example/queens.rb +3 -1
  7. data/example/send_more_money.rb +24 -30
  8. data/example/send_most_money.rb +15 -26
  9. data/example/square_tiling.rb +3 -1
  10. data/example/sudoku-set.rb +3 -1
  11. data/ext/{gecode-2.1.1 → gecode-2.2.0}/LICENSE +0 -0
  12. data/ext/{gecode-2.1.1 → gecode-2.2.0}/Makefile.contribs +0 -0
  13. data/ext/gecode-2.2.0/Makefile.dep +8056 -0
  14. data/ext/gecode-2.2.0/Makefile.in +1590 -0
  15. data/ext/gecode-2.2.0/changelog.in +2698 -0
  16. data/ext/gecode-2.2.0/configure +13112 -0
  17. data/ext/gecode-2.2.0/configure.ac +273 -0
  18. data/ext/gecode-2.2.0/configure.ac.in +269 -0
  19. data/ext/{gecode-2.1.1 → gecode-2.2.0}/contribs/README +0 -0
  20. data/ext/gecode-2.2.0/contribs/qecode/Doxyfile +263 -0
  21. data/ext/gecode-2.2.0/contribs/qecode/Implicative.cc +267 -0
  22. data/ext/gecode-2.2.0/contribs/qecode/Implicative.hh +164 -0
  23. data/ext/gecode-2.2.0/contribs/qecode/Makefile.in.in +163 -0
  24. data/ext/gecode-2.2.0/contribs/qecode/OptVar.cc +82 -0
  25. data/ext/gecode-2.2.0/contribs/qecode/OptVar.hh +123 -0
  26. data/ext/gecode-2.2.0/contribs/qecode/Strategy.cc +131 -0
  27. data/ext/gecode-2.2.0/contribs/qecode/Strategy.hh +91 -0
  28. data/ext/gecode-2.2.0/contribs/qecode/StrategyNode.cc +62 -0
  29. data/ext/gecode-2.2.0/contribs/qecode/StrategyNode.hh +47 -0
  30. data/ext/gecode-2.2.0/contribs/qecode/autom4te.cache/output.0 +2264 -0
  31. data/ext/gecode-2.2.0/contribs/qecode/autom4te.cache/requests +115 -0
  32. data/ext/gecode-2.2.0/contribs/qecode/autom4te.cache/traces.0 +57 -0
  33. data/ext/gecode-2.2.0/contribs/qecode/config.log +147 -0
  34. data/ext/gecode-2.2.0/contribs/qecode/config.status +817 -0
  35. data/ext/gecode-2.2.0/contribs/qecode/configure +2264 -0
  36. data/ext/gecode-2.2.0/contribs/qecode/configure.ac +23 -0
  37. data/ext/gecode-2.2.0/contribs/qecode/examples/COMPILING +13 -0
  38. data/ext/gecode-2.2.0/contribs/qecode/examples/MatrixGame.cpp +140 -0
  39. data/ext/gecode-2.2.0/contribs/qecode/examples/NimFibo.cpp +73 -0
  40. data/ext/gecode-2.2.0/contribs/qecode/examples/connect-5-3-3-3.cpp +842 -0
  41. data/ext/gecode-2.2.0/contribs/qecode/examples/network-pricing.cc +146 -0
  42. data/ext/gecode-2.2.0/contribs/qecode/examples/optim2.cc +149 -0
  43. data/ext/gecode-2.2.0/contribs/qecode/examples/stress_test.cpp +240 -0
  44. data/ext/{gecode-2.1.1 → gecode-2.2.0}/contribs/qecode/heap.cc +0 -0
  45. data/ext/{gecode-2.1.1 → gecode-2.2.0}/contribs/qecode/myDom.cc +0 -0
  46. data/ext/{gecode-2.1.1 → gecode-2.2.0}/contribs/qecode/myspace.cc +0 -0
  47. data/ext/gecode-2.2.0/contribs/qecode/myspace.hh +68 -0
  48. data/ext/{gecode-2.1.1 → gecode-2.2.0}/contribs/qecode/qecode.hh +0 -0
  49. data/ext/gecode-2.2.0/contribs/qecode/qsolver.cc +268 -0
  50. data/ext/gecode-2.2.0/contribs/qecode/qsolver.hh +46 -0
  51. data/ext/{gecode-2.1.1 → gecode-2.2.0}/contribs/qecode/shortdesc.ac +0 -0
  52. data/ext/{gecode-2.1.1 → gecode-2.2.0}/contribs/qecode/vartype.hh +0 -0
  53. data/ext/{gecode-2.1.1 → gecode-2.2.0}/doxygen/doxygen.conf.in +0 -0
  54. data/ext/gecode-2.2.0/doxygen/doxygen.hh.in +1112 -0
  55. data/ext/gecode-2.2.0/doxygen/reflection.hh +417 -0
  56. data/ext/gecode-2.2.0/examples/all-interval.cc +133 -0
  57. data/ext/gecode-2.2.0/examples/alpha.cc +137 -0
  58. data/ext/gecode-2.2.0/examples/bacp.cc +521 -0
  59. data/ext/gecode-2.2.0/examples/baseline.cc +87 -0
  60. data/ext/gecode-2.2.0/examples/bibd.cc +203 -0
  61. data/ext/gecode-2.2.0/examples/black-hole.cc +389 -0
  62. data/ext/gecode-2.2.0/examples/crew.cc +286 -0
  63. data/ext/gecode-2.2.0/examples/crowded-chess.cc +424 -0
  64. data/ext/gecode-2.2.0/examples/domino.cc +297 -0
  65. data/ext/gecode-2.2.0/examples/donald.cc +107 -0
  66. data/ext/gecode-2.2.0/examples/eq20.cc +125 -0
  67. data/ext/gecode-2.2.0/examples/golf.cc +297 -0
  68. data/ext/gecode-2.2.0/examples/golomb-ruler.cc +199 -0
  69. data/ext/gecode-2.2.0/examples/graph-color.cc +407 -0
  70. data/ext/gecode-2.2.0/examples/grocery.cc +113 -0
  71. data/ext/gecode-2.2.0/examples/hamming.cc +129 -0
  72. data/ext/gecode-2.2.0/examples/ind-set.cc +143 -0
  73. data/ext/gecode-2.2.0/examples/javascript.cc +163 -0
  74. data/ext/gecode-2.2.0/examples/kakuro.cc +686 -0
  75. data/ext/gecode-2.2.0/examples/knights.cc +220 -0
  76. data/ext/gecode-2.2.0/examples/langford-number.cc +225 -0
  77. data/ext/gecode-2.2.0/examples/magic-sequence.cc +146 -0
  78. data/ext/gecode-2.2.0/examples/magic-square.cc +138 -0
  79. data/ext/gecode-2.2.0/examples/minesweeper.cc +304 -0
  80. data/ext/gecode-2.2.0/examples/money.cc +105 -0
  81. data/ext/gecode-2.2.0/examples/nonogram.cc +492 -0
  82. data/ext/gecode-2.2.0/examples/ortho-latin.cc +172 -0
  83. data/ext/gecode-2.2.0/examples/partition.cc +141 -0
  84. data/ext/gecode-2.2.0/examples/pentominoes.cc +949 -0
  85. data/ext/gecode-2.2.0/examples/perfect-square.cc +311 -0
  86. data/ext/gecode-2.2.0/examples/photo.cc +170 -0
  87. data/ext/gecode-2.2.0/examples/queen-armies.cc +284 -0
  88. data/ext/gecode-2.2.0/examples/queens.cc +147 -0
  89. data/ext/gecode-2.2.0/examples/queens.js +57 -0
  90. data/ext/gecode-2.2.0/examples/sports-league.cc +342 -0
  91. data/ext/gecode-2.2.0/examples/steiner.cc +192 -0
  92. data/ext/gecode-2.2.0/examples/stress-distinct.cc +90 -0
  93. data/ext/gecode-2.2.0/examples/stress-domain.cc +99 -0
  94. data/ext/gecode-2.2.0/examples/stress-element.cc +112 -0
  95. data/ext/gecode-2.2.0/examples/stress-exec.cc +97 -0
  96. data/ext/gecode-2.2.0/examples/stress-extensional.cc +134 -0
  97. data/ext/gecode-2.2.0/examples/stress-linear-bool.cc +97 -0
  98. data/ext/gecode-2.2.0/examples/stress-min.cc +98 -0
  99. data/ext/gecode-2.2.0/examples/stress-search.cc +88 -0
  100. data/ext/gecode-2.2.0/examples/sudoku.cc +2341 -0
  101. data/ext/gecode-2.2.0/examples/support.hh +338 -0
  102. data/ext/gecode-2.2.0/examples/support/example.cc +64 -0
  103. data/ext/gecode-2.2.0/examples/support/example.icc +321 -0
  104. data/ext/gecode-2.2.0/examples/support/options.cc +226 -0
  105. data/ext/gecode-2.2.0/examples/support/options.icc +276 -0
  106. data/ext/gecode-2.2.0/examples/tsp.cc +317 -0
  107. data/ext/gecode-2.2.0/examples/warehouses.cc +191 -0
  108. data/ext/gecode-2.2.0/gecode.m4 +1046 -0
  109. data/ext/gecode-2.2.0/gecode/cpltset.hh +797 -0
  110. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/array.cc +0 -0
  111. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/array.icc +0 -0
  112. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/bddmanager.cc +0 -0
  113. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/bddmanager.icc +0 -0
  114. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/branch.cc +0 -0
  115. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/branch.hh +0 -0
  116. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/branch/select-val.icc +0 -0
  117. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/branch/select-view.icc +0 -0
  118. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/constraints/atmost.cc +0 -0
  119. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/constraints/cardinality.cc +0 -0
  120. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/constraints/distinct.cc +0 -0
  121. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/constraints/dom.cc +0 -0
  122. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/constraints/partition.cc +0 -0
  123. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/constraints/rangeroots.cc +0 -0
  124. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/constraints/rel.cc +0 -0
  125. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/constraints/select.cc +0 -0
  126. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/constraints/singleton.cc +0 -0
  127. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/exception.icc +0 -0
  128. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/propagators.hh +0 -0
  129. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/propagators/binary.icc +0 -0
  130. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/propagators/nary.icc +0 -0
  131. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/propagators/naryone.icc +0 -0
  132. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/propagators/narytwo.icc +0 -0
  133. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/propagators/singleton.icc +0 -0
  134. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/propagators/unary.icc +0 -0
  135. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/support.cc +0 -0
  136. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/support.icc +0 -0
  137. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/var-imp.icc +0 -0
  138. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/var-imp/cpltset.cc +0 -0
  139. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/var-imp/cpltset.icc +0 -0
  140. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/var-imp/cpltset.vis +0 -0
  141. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/var/cpltset.cc +0 -0
  142. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/var/cpltset.icc +0 -0
  143. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/view.icc +0 -0
  144. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/view/cpltset.icc +0 -0
  145. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/cpltset/view/print.cc +0 -0
  146. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/gist.hh +0 -0
  147. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/gist/addchild.cc +0 -0
  148. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/gist/addchild.hh +0 -0
  149. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/gist/addvisualisationdialog.cc +0 -0
  150. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/gist/addvisualisationdialog.hh +0 -0
  151. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/gist/better.hh +0 -0
  152. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/gist/config.cc +0 -0
  153. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/gist/config.hh +0 -0
  154. data/ext/gecode-2.2.0/gecode/gist/drawingcursor.cc +281 -0
  155. data/ext/gecode-2.2.0/gecode/gist/drawingcursor.hh +103 -0
  156. data/ext/gecode-2.2.0/gecode/gist/drawingcursor.icc +70 -0
  157. data/ext/gecode-2.2.0/gecode/gist/gecodelogo.cc +672 -0
  158. data/ext/gecode-2.2.0/gecode/gist/gecodelogo.hh +64 -0
  159. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/gist/gist.cc +0 -0
  160. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/gist/gist.icc +0 -0
  161. data/ext/gecode-2.2.0/gecode/gist/layoutcursor.cc +115 -0
  162. data/ext/gecode-2.2.0/gecode/gist/layoutcursor.hh +75 -0
  163. data/ext/gecode-2.2.0/gecode/gist/layoutcursor.icc +48 -0
  164. data/ext/gecode-2.2.0/gecode/gist/mainwindow.cc +274 -0
  165. data/ext/gecode-2.2.0/gecode/gist/mainwindow.hh +86 -0
  166. data/ext/gecode-2.2.0/gecode/gist/node.cc +148 -0
  167. data/ext/gecode-2.2.0/gecode/gist/node.hh +117 -0
  168. data/ext/gecode-2.2.0/gecode/gist/node.icc +99 -0
  169. data/ext/gecode-2.2.0/gecode/gist/nodecursor.cc +123 -0
  170. data/ext/gecode-2.2.0/gecode/gist/nodecursor.hh +147 -0
  171. data/ext/gecode-2.2.0/gecode/gist/nodecursor.icc +122 -0
  172. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/gist/nodevisitor.hh +0 -0
  173. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/gist/nodevisitor.icc +0 -0
  174. data/ext/gecode-2.2.0/gecode/gist/preferences.cc +120 -0
  175. data/ext/gecode-2.2.0/gecode/gist/preferences.hh +79 -0
  176. data/ext/gecode-2.2.0/gecode/gist/spacenode.cc +468 -0
  177. data/ext/gecode-2.2.0/gecode/gist/spacenode.hh +227 -0
  178. data/ext/gecode-2.2.0/gecode/gist/spacenode.icc +170 -0
  179. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/gist/test.cc +0 -0
  180. data/ext/gecode-2.2.0/gecode/gist/textoutput.cc +134 -0
  181. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/gist/textoutput.hh +0 -0
  182. data/ext/gecode-2.2.0/gecode/gist/treecanvas.cc +1343 -0
  183. data/ext/gecode-2.2.0/gecode/gist/treecanvas.hh +361 -0
  184. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/gist/ui_addchild.hh +0 -0
  185. data/ext/gecode-2.2.0/gecode/gist/ui_addvisualisationdialog.hh +165 -0
  186. data/ext/gecode-2.2.0/gecode/gist/visualisation/intvaritem.cc +192 -0
  187. data/ext/gecode-2.2.0/gecode/gist/visualisation/intvaritem.hh +75 -0
  188. data/ext/gecode-2.2.0/gecode/gist/visualisation/setvaritem.cc +235 -0
  189. data/ext/gecode-2.2.0/gecode/gist/visualisation/setvaritem.hh +77 -0
  190. data/ext/gecode-2.2.0/gecode/gist/visualisation/vararrayitem.hh +125 -0
  191. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/gist/visualisation/vararrayview.cc +0 -0
  192. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/gist/visualisation/vararrayview.hh +0 -0
  193. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/gist/visualisation/vararrayviewt.hh +0 -0
  194. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/gist/visualisation/varitem.cc +0 -0
  195. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/gist/visualisation/varitem.hh +0 -0
  196. data/ext/gecode-2.2.0/gecode/gist/visualnode.cc +474 -0
  197. data/ext/gecode-2.2.0/gecode/gist/visualnode.hh +226 -0
  198. data/ext/gecode-2.2.0/gecode/gist/visualnode.icc +198 -0
  199. data/ext/gecode-2.2.0/gecode/gist/zoomToFitIcon.icc +113 -0
  200. data/ext/gecode-2.2.0/gecode/int.hh +2116 -0
  201. data/ext/gecode-2.2.0/gecode/int/arithmetic.cc +237 -0
  202. data/ext/gecode-2.2.0/gecode/int/arithmetic.hh +827 -0
  203. data/ext/gecode-2.2.0/gecode/int/arithmetic/abs.icc +278 -0
  204. data/ext/gecode-2.2.0/gecode/int/arithmetic/divmod.icc +496 -0
  205. data/ext/gecode-2.2.0/gecode/int/arithmetic/max.icc +474 -0
  206. data/ext/gecode-2.2.0/gecode/int/arithmetic/mult.icc +858 -0
  207. data/ext/gecode-2.2.0/gecode/int/arithmetic/sqr.icc +464 -0
  208. data/ext/gecode-2.2.0/gecode/int/arithmetic/sqrt.icc +260 -0
  209. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/array.cc +0 -0
  210. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/array.icc +0 -0
  211. data/ext/gecode-2.2.0/gecode/int/bool.cc +734 -0
  212. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/bool.hh +0 -0
  213. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/bool/base.icc +0 -0
  214. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/bool/eq.icc +0 -0
  215. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/bool/eqv.icc +0 -0
  216. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/bool/lq.icc +0 -0
  217. data/ext/gecode-2.2.0/gecode/int/bool/or.icc +1000 -0
  218. data/ext/gecode-2.2.0/gecode/int/branch.cc +167 -0
  219. data/ext/gecode-2.2.0/gecode/int/branch.hh +587 -0
  220. data/ext/gecode-2.2.0/gecode/int/branch/create-branch.icc +190 -0
  221. data/ext/gecode-2.2.0/gecode/int/branch/select-val.icc +340 -0
  222. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/branch/select-view.icc +0 -0
  223. data/ext/gecode-2.2.0/gecode/int/channel.cc +165 -0
  224. data/ext/gecode-2.2.0/gecode/int/channel.hh +259 -0
  225. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/channel/base.icc +0 -0
  226. data/ext/gecode-2.2.0/gecode/int/channel/dom.icc +348 -0
  227. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/channel/link-multi.cc +0 -0
  228. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/channel/link-multi.icc +0 -0
  229. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/channel/link-single.cc +0 -0
  230. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/channel/link-single.icc +0 -0
  231. data/ext/gecode-2.2.0/gecode/int/channel/val.icc +278 -0
  232. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/circuit.cc +0 -0
  233. data/ext/gecode-2.2.0/gecode/int/circuit.hh +175 -0
  234. data/ext/gecode-2.2.0/gecode/int/circuit/base.icc +266 -0
  235. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/circuit/dom.icc +0 -0
  236. data/ext/gecode-2.2.0/gecode/int/circuit/val.icc +126 -0
  237. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/count.cc +0 -0
  238. data/ext/gecode-2.2.0/gecode/int/count.hh +487 -0
  239. data/ext/gecode-2.2.0/gecode/int/count/int.icc +620 -0
  240. data/ext/gecode-2.2.0/gecode/int/count/rel.icc +144 -0
  241. data/ext/gecode-2.2.0/gecode/int/count/view.icc +449 -0
  242. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/cumulatives.cc +0 -0
  243. data/ext/gecode-2.2.0/gecode/int/cumulatives.hh +138 -0
  244. data/ext/gecode-2.2.0/gecode/int/cumulatives/val.icc +455 -0
  245. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/distinct.cc +0 -0
  246. data/ext/gecode-2.2.0/gecode/int/distinct.hh +341 -0
  247. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/distinct/bilink.icc +0 -0
  248. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/distinct/bnd.icc +0 -0
  249. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/distinct/combptr.icc +0 -0
  250. data/ext/gecode-2.2.0/gecode/int/distinct/dom.icc +752 -0
  251. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/distinct/edge.icc +0 -0
  252. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/distinct/node.icc +0 -0
  253. data/ext/gecode-2.2.0/gecode/int/distinct/ter-dom.icc +136 -0
  254. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/distinct/val.icc +0 -0
  255. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/dom.cc +0 -0
  256. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/dom.hh +0 -0
  257. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/dom/range.icc +0 -0
  258. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/dom/spec.icc +0 -0
  259. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/element.cc +0 -0
  260. data/ext/gecode-2.2.0/gecode/int/element.hh +239 -0
  261. data/ext/gecode-2.2.0/gecode/int/element/int.icc +444 -0
  262. data/ext/gecode-2.2.0/gecode/int/element/view.icc +584 -0
  263. data/ext/gecode-2.2.0/gecode/int/exception.icc +174 -0
  264. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/extensional.cc +0 -0
  265. data/ext/gecode-2.2.0/gecode/int/extensional.hh +415 -0
  266. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/extensional/base.icc +0 -0
  267. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/extensional/basic.icc +0 -0
  268. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/extensional/bitset.icc +0 -0
  269. data/ext/gecode-2.2.0/gecode/int/extensional/dfa.cc +565 -0
  270. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/extensional/dfa.icc +0 -0
  271. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/extensional/incremental.icc +0 -0
  272. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/extensional/layered-graph.icc +0 -0
  273. data/ext/gecode-2.2.0/gecode/int/extensional/tuple-set.cc +285 -0
  274. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/extensional/tuple-set.icc +0 -0
  275. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/gcc.cc +0 -0
  276. data/ext/gecode-2.2.0/gecode/int/gcc.hh +329 -0
  277. data/ext/gecode-2.2.0/gecode/int/gcc/bnd.icc +660 -0
  278. data/ext/gecode-2.2.0/gecode/int/gcc/dom.icc +531 -0
  279. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/gcc/gccbndsup.icc +0 -0
  280. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/gcc/graphsup.icc +0 -0
  281. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/gcc/lbc.icc +0 -0
  282. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/gcc/occur.icc +0 -0
  283. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/gcc/ubc.icc +0 -0
  284. data/ext/gecode-2.2.0/gecode/int/gcc/val.icc +400 -0
  285. data/ext/gecode-2.2.0/gecode/int/int-set.cc +157 -0
  286. data/ext/gecode-2.2.0/gecode/int/int-set.icc +195 -0
  287. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/limits.icc +0 -0
  288. data/ext/gecode-2.2.0/gecode/int/linear-bool.cc +235 -0
  289. data/ext/gecode-2.2.0/gecode/int/linear-int.cc +272 -0
  290. data/ext/gecode-2.2.0/gecode/int/linear.hh +1849 -0
  291. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/linear/bool-int.icc +0 -0
  292. data/ext/gecode-2.2.0/gecode/int/linear/bool-post.cc +433 -0
  293. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/linear/bool-scale.icc +0 -0
  294. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/linear/bool-view.icc +0 -0
  295. data/ext/gecode-2.2.0/gecode/int/linear/int-bin.icc +605 -0
  296. data/ext/gecode-2.2.0/gecode/int/linear/int-dom.icc +539 -0
  297. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/linear/int-nary.icc +0 -0
  298. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/linear/int-noview.icc +0 -0
  299. data/ext/gecode-2.2.0/gecode/int/linear/int-post.cc +493 -0
  300. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/linear/int-ter.icc +0 -0
  301. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/linear/post.icc +0 -0
  302. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/propagator.icc +0 -0
  303. data/ext/gecode-2.2.0/gecode/int/rel.cc +420 -0
  304. data/ext/gecode-2.2.0/gecode/int/rel.hh +627 -0
  305. data/ext/gecode-2.2.0/gecode/int/rel/eq.icc +885 -0
  306. data/ext/gecode-2.2.0/gecode/int/rel/lex.icc +275 -0
  307. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/rel/lq-le.icc +0 -0
  308. data/ext/gecode-2.2.0/gecode/int/rel/nq.icc +118 -0
  309. data/ext/gecode-2.2.0/gecode/int/sorted.cc +81 -0
  310. data/ext/gecode-2.2.0/gecode/int/sorted.hh +118 -0
  311. data/ext/gecode-2.2.0/gecode/int/sorted/matching.icc +173 -0
  312. data/ext/gecode-2.2.0/gecode/int/sorted/narrowing.icc +249 -0
  313. data/ext/gecode-2.2.0/gecode/int/sorted/order.icc +212 -0
  314. data/ext/gecode-2.2.0/gecode/int/sorted/propagate.icc +702 -0
  315. data/ext/gecode-2.2.0/gecode/int/sorted/sortsup.icc +563 -0
  316. data/ext/gecode-2.2.0/gecode/int/support-values.hh +158 -0
  317. data/ext/gecode-2.2.0/gecode/int/support-values.icc +203 -0
  318. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/unshare.cc +0 -0
  319. data/ext/gecode-2.2.0/gecode/int/var-imp.icc +745 -0
  320. data/ext/gecode-2.2.0/gecode/int/var-imp/bool.cc +105 -0
  321. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/var-imp/bool.icc +0 -0
  322. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/var-imp/bool.vis +0 -0
  323. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/var-imp/delta.icc +0 -0
  324. data/ext/gecode-2.2.0/gecode/int/var-imp/int.cc +408 -0
  325. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/var-imp/int.icc +0 -0
  326. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/var-imp/int.vis +0 -0
  327. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/var/bool.cc +0 -0
  328. data/ext/gecode-2.2.0/gecode/int/var/bool.icc +128 -0
  329. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/var/int.cc +0 -0
  330. data/ext/gecode-2.2.0/gecode/int/var/int.icc +153 -0
  331. data/ext/gecode-2.2.0/gecode/int/view.icc +1918 -0
  332. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/view/bool.icc +0 -0
  333. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/view/constint.icc +0 -0
  334. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/view/int.icc +0 -0
  335. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/view/iter.icc +0 -0
  336. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/view/minus.icc +0 -0
  337. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/view/offset.icc +0 -0
  338. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/view/print.cc +0 -0
  339. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/view/rtest.icc +0 -0
  340. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/view/scale.icc +0 -0
  341. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/int/view/zero.icc +0 -0
  342. data/ext/gecode-2.2.0/gecode/iter.hh +98 -0
  343. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/ranges-add.icc +0 -0
  344. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/ranges-append.icc +0 -0
  345. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/ranges-array.icc +0 -0
  346. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/ranges-cache.icc +0 -0
  347. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/ranges-compl.icc +0 -0
  348. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/ranges-diff.icc +0 -0
  349. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/ranges-empty.icc +0 -0
  350. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/ranges-inter.icc +0 -0
  351. data/ext/gecode-2.2.0/gecode/iter/ranges-map.icc +260 -0
  352. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/ranges-minmax.icc +0 -0
  353. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/ranges-minus.icc +0 -0
  354. data/ext/gecode-2.2.0/gecode/iter/ranges-negative.icc +137 -0
  355. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/ranges-offset.icc +0 -0
  356. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/ranges-operations.icc +0 -0
  357. data/ext/gecode-2.2.0/gecode/iter/ranges-positive.icc +139 -0
  358. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/ranges-scale.icc +0 -0
  359. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/ranges-singleton-append.icc +0 -0
  360. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/ranges-singleton.icc +0 -0
  361. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/ranges-size.icc +0 -0
  362. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/ranges-union.icc +0 -0
  363. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/ranges-values.icc +0 -0
  364. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/values-array.icc +0 -0
  365. data/ext/gecode-2.2.0/gecode/iter/values-inter.icc +130 -0
  366. data/ext/gecode-2.2.0/gecode/iter/values-map.icc +136 -0
  367. data/ext/gecode-2.2.0/gecode/iter/values-minus.icc +130 -0
  368. data/ext/gecode-2.2.0/gecode/iter/values-negative.icc +116 -0
  369. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/values-offset.icc +0 -0
  370. data/ext/gecode-2.2.0/gecode/iter/values-positive.icc +123 -0
  371. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/values-ranges.icc +0 -0
  372. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/values-singleton.icc +0 -0
  373. data/ext/gecode-2.2.0/gecode/iter/values-union.icc +137 -0
  374. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/values-unique.icc +0 -0
  375. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/virtual-ranges-compl.icc +0 -0
  376. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/virtual-ranges-inter.icc +0 -0
  377. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/virtual-ranges-union.icc +0 -0
  378. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/iter/virtual-ranges.icc +0 -0
  379. data/ext/gecode-2.2.0/gecode/kernel.hh +188 -0
  380. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/kernel/advisor.icc +0 -0
  381. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/kernel/array.icc +0 -0
  382. data/ext/gecode-2.2.0/gecode/kernel/branching.icc +433 -0
  383. data/ext/gecode-2.2.0/gecode/kernel/core.cc +474 -0
  384. data/ext/gecode-2.2.0/gecode/kernel/core.icc +2311 -0
  385. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/kernel/exception.icc +0 -0
  386. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/kernel/macros.icc +0 -0
  387. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/kernel/memory-manager.cc +0 -0
  388. data/ext/gecode-2.2.0/gecode/kernel/memory-manager.icc +454 -0
  389. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/kernel/modevent.icc +0 -0
  390. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/kernel/propagator.icc +0 -0
  391. data/ext/gecode-2.2.0/gecode/kernel/reflection.cc +951 -0
  392. data/ext/gecode-2.2.0/gecode/kernel/reflection.icc +1213 -0
  393. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/kernel/shared-array.icc +0 -0
  394. data/ext/gecode-2.2.0/gecode/kernel/var-imp.icc +433 -0
  395. data/ext/gecode-2.2.0/gecode/kernel/var-map.cc +269 -0
  396. data/ext/gecode-2.2.0/gecode/kernel/var-map.icc +230 -0
  397. data/ext/gecode-2.2.0/gecode/kernel/var-traits.icc +79 -0
  398. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/kernel/var-type.cc +0 -0
  399. data/ext/gecode-2.2.0/gecode/kernel/var-type.icc +915 -0
  400. data/ext/gecode-2.2.0/gecode/kernel/var.icc +114 -0
  401. data/ext/gecode-2.2.0/gecode/kernel/view.icc +413 -0
  402. data/ext/gecode-2.2.0/gecode/minimodel.hh +1206 -0
  403. data/ext/gecode-2.2.0/gecode/minimodel/arithmetic.icc +118 -0
  404. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/minimodel/bool-expr.cc +0 -0
  405. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/minimodel/bool-expr.icc +0 -0
  406. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/minimodel/bool-rel.icc +0 -0
  407. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/minimodel/exception.icc +0 -0
  408. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/minimodel/lin-expr.icc +0 -0
  409. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/minimodel/lin-rel.icc +0 -0
  410. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/minimodel/matrix.icc +0 -0
  411. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/minimodel/reg.cc +0 -0
  412. data/ext/gecode-2.2.0/gecode/search.hh +759 -0
  413. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/search/bab.cc +0 -0
  414. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/search/bab.icc +0 -0
  415. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/search/dfs.cc +0 -0
  416. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/search/dfs.icc +0 -0
  417. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/search/engine-ctrl.icc +0 -0
  418. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/search/lds.cc +0 -0
  419. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/search/lds.icc +0 -0
  420. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/search/options.cc +0 -0
  421. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/search/options.icc +0 -0
  422. data/ext/gecode-2.2.0/gecode/search/reco-stack.icc +277 -0
  423. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/search/restart.icc +0 -0
  424. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/search/statistics.icc +0 -0
  425. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/search/stop.cc +0 -0
  426. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/search/stop.icc +0 -0
  427. data/ext/gecode-2.2.0/gecode/serialization.hh +149 -0
  428. data/ext/gecode-2.2.0/gecode/serialization/boost.cc +78 -0
  429. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/serialization/boost.icc +0 -0
  430. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/serialization/flatzinc.cc +0 -0
  431. data/ext/gecode-2.2.0/gecode/serialization/javascript.cc +343 -0
  432. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/serialization/javascript.hh +0 -0
  433. data/ext/gecode-2.2.0/gecode/serialization/register.cc +8498 -0
  434. data/ext/gecode-2.2.0/gecode/set.hh +970 -0
  435. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/array.cc +0 -0
  436. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/array.icc +0 -0
  437. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/branch.cc +0 -0
  438. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/branch.hh +0 -0
  439. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/branch/select-val.icc +0 -0
  440. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/branch/select-view.icc +0 -0
  441. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/cardinality.cc +0 -0
  442. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/convex.cc +0 -0
  443. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/convex.hh +0 -0
  444. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/convex/conv.cc +0 -0
  445. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/convex/conv.icc +0 -0
  446. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/convex/hull.cc +0 -0
  447. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/convex/hull.icc +0 -0
  448. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/distinct.cc +0 -0
  449. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/distinct.hh +0 -0
  450. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/distinct/atmostOne.cc +0 -0
  451. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/distinct/atmostOne.icc +0 -0
  452. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/dom.cc +0 -0
  453. data/ext/gecode-2.2.0/gecode/set/element.cc +135 -0
  454. data/ext/gecode-2.2.0/gecode/set/element.hh +233 -0
  455. data/ext/gecode-2.2.0/gecode/set/element/disjoint.cc +308 -0
  456. data/ext/gecode-2.2.0/gecode/set/element/disjoint.icc +75 -0
  457. data/ext/gecode-2.2.0/gecode/set/element/idxarray.hh +113 -0
  458. data/ext/gecode-2.2.0/gecode/set/element/idxarray.icc +155 -0
  459. data/ext/gecode-2.2.0/gecode/set/element/inter.icc +348 -0
  460. data/ext/gecode-2.2.0/gecode/set/element/union.icc +371 -0
  461. data/ext/gecode-2.2.0/gecode/set/element/unionConst.icc +334 -0
  462. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/exception.icc +0 -0
  463. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/int.cc +0 -0
  464. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/int.hh +0 -0
  465. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/int/card.icc +0 -0
  466. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/int/channel-bool.icc +0 -0
  467. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/int/channel-int.icc +0 -0
  468. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/int/match.icc +0 -0
  469. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/int/minmax.icc +0 -0
  470. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/int/weights.icc +0 -0
  471. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/limits.icc +0 -0
  472. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/projectors-compiler.hh +0 -0
  473. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/projectors.cc +0 -0
  474. data/ext/gecode-2.2.0/gecode/set/projectors.hh +438 -0
  475. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/projectors/compiler.cc +0 -0
  476. data/ext/gecode-2.2.0/gecode/set/projectors/formula.cc +312 -0
  477. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/projectors/formula.icc +0 -0
  478. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/projectors/projector-set.cc +0 -0
  479. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/projectors/projector-set.icc +0 -0
  480. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/projectors/projector.cc +0 -0
  481. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/projectors/projector.icc +0 -0
  482. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/projectors/propagator.hh +0 -0
  483. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/projectors/propagator/card.icc +0 -0
  484. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/projectors/propagator/nary.icc +0 -0
  485. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/projectors/propagator/re-nary.cc +0 -0
  486. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/projectors/propagator/re-nary.icc +0 -0
  487. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/projectors/set-expr.cc +0 -0
  488. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/projectors/set-expr.icc +0 -0
  489. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/propagator.icc +0 -0
  490. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/rel-op-const.cc +0 -0
  491. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/rel-op.cc +0 -0
  492. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/rel-op.hh +0 -0
  493. data/ext/gecode-2.2.0/gecode/set/rel-op/common.icc +613 -0
  494. data/ext/gecode-2.2.0/gecode/set/rel-op/inter.icc +452 -0
  495. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/rel-op/partition.icc +0 -0
  496. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/rel-op/post.icc +0 -0
  497. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/rel-op/subofunion.icc +0 -0
  498. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/rel-op/superofinter.icc +0 -0
  499. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/rel-op/union.icc +0 -0
  500. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/rel.cc +0 -0
  501. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/rel.hh +0 -0
  502. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/rel/common.icc +0 -0
  503. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/rel/eq.icc +0 -0
  504. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/rel/nosubset.icc +0 -0
  505. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/rel/nq.icc +0 -0
  506. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/rel/re-eq.icc +0 -0
  507. data/ext/gecode-2.2.0/gecode/set/rel/re-subset.icc +174 -0
  508. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/rel/subset.icc +0 -0
  509. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/sequence.cc +0 -0
  510. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/sequence.hh +0 -0
  511. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/sequence/common.icc +0 -0
  512. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/sequence/seq-u.cc +0 -0
  513. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/sequence/seq-u.icc +0 -0
  514. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/sequence/seq.cc +0 -0
  515. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/sequence/seq.icc +0 -0
  516. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/var-imp.icc +0 -0
  517. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/var-imp/delta.icc +0 -0
  518. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/var-imp/integerset.cc +0 -0
  519. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/var-imp/integerset.icc +0 -0
  520. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/var-imp/iter.icc +0 -0
  521. data/ext/gecode-2.2.0/gecode/set/var-imp/set.cc +215 -0
  522. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/var-imp/set.icc +0 -0
  523. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/var-imp/set.vis +0 -0
  524. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/var/set.cc +0 -0
  525. data/ext/gecode-2.2.0/gecode/set/var/set.icc +303 -0
  526. data/ext/gecode-2.2.0/gecode/set/view.icc +1451 -0
  527. data/ext/gecode-2.2.0/gecode/set/view/complement.icc +614 -0
  528. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/view/const.icc +0 -0
  529. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/view/offset.icc +0 -0
  530. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/view/print.cc +0 -0
  531. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/view/set.icc +0 -0
  532. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/set/view/singleton.icc +0 -0
  533. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support.hh +0 -0
  534. data/ext/gecode-2.2.0/gecode/support/block-allocator.icc +159 -0
  535. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/AUTHORS +0 -0
  536. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/ChangeLog +0 -0
  537. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/NEWS +0 -0
  538. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/README +0 -0
  539. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/bdd.h +0 -0
  540. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/bddio.c +0 -0
  541. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/bddop.c +0 -0
  542. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/bddtree.h +0 -0
  543. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/bvec.c +0 -0
  544. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/bvec.h +0 -0
  545. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/cache.c +0 -0
  546. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/cache.h +0 -0
  547. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/config.h +0 -0
  548. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/cppext.cc +0 -0
  549. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/fdd.c +0 -0
  550. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/fdd.h +0 -0
  551. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/imatrix.c +0 -0
  552. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/imatrix.h +0 -0
  553. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/kernel.c +0 -0
  554. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/kernel.h +0 -0
  555. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/pairs.c +0 -0
  556. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/prime.c +0 -0
  557. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/prime.h +0 -0
  558. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/reorder.c +0 -0
  559. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/buddy/tree.c +0 -0
  560. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/cast.icc +0 -0
  561. data/ext/gecode-2.2.0/gecode/support/config.icc.in +83 -0
  562. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/dynamic-array.icc +0 -0
  563. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/dynamic-stack.icc +0 -0
  564. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/exception.cc +0 -0
  565. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/exception.icc +0 -0
  566. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/macros.icc +0 -0
  567. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/map.icc +0 -0
  568. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/marked-pointer.icc +0 -0
  569. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/memory.icc +0 -0
  570. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/random.icc +0 -0
  571. data/ext/gecode-2.2.0/gecode/support/sentinel-stack.icc +138 -0
  572. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/sort.icc +0 -0
  573. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/static-pqueue.icc +0 -0
  574. data/ext/{gecode-2.1.1 → gecode-2.2.0}/gecode/support/static-stack.icc +0 -0
  575. data/ext/gecode-2.2.0/gecode/support/symbol.cc +241 -0
  576. data/ext/gecode-2.2.0/gecode/support/symbol.icc +134 -0
  577. data/ext/{gecode-2.1.1 → gecode-2.2.0}/install-sh +0 -0
  578. data/ext/{gecode-2.1.1 → gecode-2.2.0}/misc/AppleHelpbookInfo.plist +0 -0
  579. data/ext/{gecode-2.1.1 → gecode-2.2.0}/misc/allexamples.perl +0 -0
  580. data/ext/{gecode-2.1.1 → gecode-2.2.0}/misc/debian/Makefile.am +0 -0
  581. data/ext/{gecode-2.1.1 → gecode-2.2.0}/misc/debian/changelog +0 -0
  582. data/ext/{gecode-2.1.1 → gecode-2.2.0}/misc/debian/control +0 -0
  583. data/ext/{gecode-2.1.1 → gecode-2.2.0}/misc/debian/copyright +0 -0
  584. data/ext/{gecode-2.1.1 → gecode-2.2.0}/misc/debian/gecode.info +0 -0
  585. data/ext/{gecode-2.1.1 → gecode-2.2.0}/misc/debian/gecode.install +0 -0
  586. data/ext/{gecode-2.1.1 → gecode-2.2.0}/misc/debian/gecode.spec +0 -0
  587. data/ext/{gecode-2.1.1 → gecode-2.2.0}/misc/debian/rules +0 -0
  588. data/ext/{gecode-2.1.1 → gecode-2.2.0}/misc/doxygen/back.png +0 -0
  589. data/ext/{gecode-2.1.1 → gecode-2.2.0}/misc/doxygen/footer.html +0 -0
  590. data/ext/{gecode-2.1.1 → gecode-2.2.0}/misc/doxygen/gecode-logo-100.png +0 -0
  591. data/ext/{gecode-2.1.1 → gecode-2.2.0}/misc/doxygen/header.html +0 -0
  592. data/ext/{gecode-2.1.1 → gecode-2.2.0}/misc/doxygen/stylesheet.css +0 -0
  593. data/ext/{gecode-2.1.1 → gecode-2.2.0}/misc/fixproperties.sh +0 -0
  594. data/ext/gecode-2.2.0/misc/gecode-gist.pc.in +45 -0
  595. data/ext/gecode-2.2.0/misc/gecode-minimodel.pc.in +45 -0
  596. data/ext/gecode-2.2.0/misc/gecode-search.pc.in +45 -0
  597. data/ext/gecode-2.2.0/misc/gecode-serialization.pc.in +45 -0
  598. data/ext/gecode-2.2.0/misc/gecode.pc.in +45 -0
  599. data/ext/{gecode-2.1.1 → gecode-2.2.0}/misc/genchangelog.perl +0 -0
  600. data/ext/{gecode-2.1.1 → gecode-2.2.0}/misc/genlcovmakefile.perl +0 -0
  601. data/ext/{gecode-2.1.1 → gecode-2.2.0}/misc/genlicense.perl +0 -0
  602. data/ext/{gecode-2.1.1 → gecode-2.2.0}/misc/genregistry.perl +0 -0
  603. data/ext/gecode-2.2.0/misc/genstatistics.perl +179 -0
  604. data/ext/{gecode-2.1.1 → gecode-2.2.0}/misc/gentxtchangelog.perl +0 -0
  605. data/ext/gecode-2.2.0/misc/genvariables.perl +905 -0
  606. data/ext/{gecode-2.1.1 → gecode-2.2.0}/misc/getrevision.perl +0 -0
  607. data/ext/{gecode-2.1.1 → gecode-2.2.0}/misc/makedepend.perl +0 -0
  608. data/ext/{gecode-2.1.1 → gecode-2.2.0}/misc/svn-ignore.txt +0 -0
  609. data/ext/gecode-2.2.0/test/assign.cc +181 -0
  610. data/ext/gecode-2.2.0/test/assign.hh +93 -0
  611. data/ext/gecode-2.2.0/test/assign/bool.cc +61 -0
  612. data/ext/gecode-2.2.0/test/assign/int.cc +70 -0
  613. data/ext/gecode-2.2.0/test/branch.cc +563 -0
  614. data/ext/gecode-2.2.0/test/branch.hh +144 -0
  615. data/ext/gecode-2.2.0/test/branch/bool.cc +61 -0
  616. data/ext/gecode-2.2.0/test/branch/cpltset.cc +71 -0
  617. data/ext/gecode-2.2.0/test/branch/int.cc +70 -0
  618. data/ext/gecode-2.2.0/test/branch/set.cc +74 -0
  619. data/ext/gecode-2.2.0/test/cpltset.cc +568 -0
  620. data/ext/gecode-2.2.0/test/cpltset.hh +125 -0
  621. data/ext/gecode-2.2.0/test/cpltset/atmost.cc +155 -0
  622. data/ext/gecode-2.2.0/test/cpltset/cardinality.cc +138 -0
  623. data/ext/gecode-2.2.0/test/cpltset/dom.cc +137 -0
  624. data/ext/gecode-2.2.0/test/cpltset/partition.cc +210 -0
  625. data/ext/gecode-2.2.0/test/cpltset/rel.cc +158 -0
  626. data/ext/gecode-2.2.0/test/cpltset/select.cc +216 -0
  627. data/ext/gecode-2.2.0/test/int.cc +688 -0
  628. data/ext/gecode-2.2.0/test/int.hh +267 -0
  629. data/ext/gecode-2.2.0/test/int.icc +266 -0
  630. data/ext/gecode-2.2.0/test/int/arithmetic.cc +766 -0
  631. data/ext/gecode-2.2.0/test/int/basic.cc +77 -0
  632. data/ext/gecode-2.2.0/test/int/bool.cc +340 -0
  633. data/ext/gecode-2.2.0/test/int/channel.cc +238 -0
  634. data/ext/gecode-2.2.0/test/int/circuit.cc +100 -0
  635. data/ext/gecode-2.2.0/test/int/count.cc +357 -0
  636. data/ext/gecode-2.2.0/test/int/distinct.cc +248 -0
  637. data/ext/gecode-2.2.0/test/int/dom.cc +123 -0
  638. data/ext/gecode-2.2.0/test/int/element.cc +333 -0
  639. data/ext/gecode-2.2.0/test/int/extensional.cc +475 -0
  640. data/ext/gecode-2.2.0/test/int/gcc.cc +293 -0
  641. data/ext/gecode-2.2.0/test/int/linear.cc +383 -0
  642. data/ext/gecode-2.2.0/test/int/mm-arithmetic.cc +302 -0
  643. data/ext/gecode-2.2.0/test/int/mm-bool.cc +4342 -0
  644. data/ext/gecode-2.2.0/test/int/mm-count.cc +295 -0
  645. data/ext/gecode-2.2.0/test/int/mm-lin.cc +2035 -0
  646. data/ext/gecode-2.2.0/test/int/mm-rel.cc +136 -0
  647. data/ext/gecode-2.2.0/test/int/rel.cc +416 -0
  648. data/ext/gecode-2.2.0/test/int/scheduling.cc +276 -0
  649. data/ext/gecode-2.2.0/test/int/sorted.cc +165 -0
  650. data/ext/gecode-2.2.0/test/int/unshare.cc +109 -0
  651. data/ext/gecode-2.2.0/test/search.cc +618 -0
  652. data/ext/gecode-2.2.0/test/set.cc +753 -0
  653. data/ext/gecode-2.2.0/test/set.hh +286 -0
  654. data/ext/gecode-2.2.0/test/set.icc +108 -0
  655. data/ext/gecode-2.2.0/test/set/convex.cc +139 -0
  656. data/ext/gecode-2.2.0/test/set/distinct.cc +116 -0
  657. data/ext/gecode-2.2.0/test/set/dom.cc +292 -0
  658. data/ext/gecode-2.2.0/test/set/int.cc +473 -0
  659. data/ext/gecode-2.2.0/test/set/projection.cc +436 -0
  660. data/ext/gecode-2.2.0/test/set/rel-op-const.cc +368 -0
  661. data/ext/gecode-2.2.0/test/set/rel-op.cc +465 -0
  662. data/ext/gecode-2.2.0/test/set/rel.cc +125 -0
  663. data/ext/gecode-2.2.0/test/set/select.cc +299 -0
  664. data/ext/gecode-2.2.0/test/set/sequence.cc +125 -0
  665. data/ext/gecode-2.2.0/test/test.cc +287 -0
  666. data/ext/gecode-2.2.0/test/test.hh +175 -0
  667. data/ext/gecode-2.2.0/test/test.icc +93 -0
  668. data/ext/{gecode-2.1.1 → gecode-2.2.0}/variables.vsl +0 -0
  669. data/lib/gecoder/bindings.rb +7 -5
  670. data/lib/gecoder/bindings/bindings.rb +8 -8
  671. data/lib/gecoder/interface.rb +4 -2
  672. data/lib/gecoder/interface/binding_changes.rb +1 -1
  673. data/lib/gecoder/interface/branch.rb +1 -1
  674. data/lib/gecoder/interface/constraints/bool_enum_constraints.rb +4 -4
  675. data/lib/gecoder/interface/constraints/bool_var_constraints.rb +2 -2
  676. data/lib/gecoder/interface/constraints/extensional_regexp.rb +1 -1
  677. data/lib/gecoder/interface/constraints/fixnum_enum_constraints.rb +2 -2
  678. data/lib/gecoder/interface/constraints/int_enum/extensional.rb +5 -5
  679. data/lib/gecoder/interface/constraints/int_enum_constraints.rb +4 -4
  680. data/lib/gecoder/interface/constraints/int_var_constraints.rb +2 -2
  681. data/lib/gecoder/interface/constraints/selected_set/select.rb +8 -8
  682. data/lib/gecoder/interface/constraints/set_enum/element.rb +79 -0
  683. data/lib/gecoder/interface/constraints/set_enum_constraints.rb +5 -5
  684. data/lib/gecoder/interface/constraints/set_var_constraints.rb +2 -2
  685. data/lib/gecoder/interface/convenience.rb +99 -0
  686. data/lib/gecoder/interface/enum_wrapper.rb +1 -1
  687. data/lib/gecoder/interface/mixin.rb +486 -0
  688. data/lib/gecoder/interface/search.rb +23 -22
  689. data/lib/gecoder/version.rb +1 -1
  690. data/specs/branch.rb +5 -3
  691. data/specs/constraints/bool/boolean.rb +3 -1
  692. data/specs/constraints/bool/linear.rb +3 -1
  693. data/specs/constraints/bool_enum/bool_enum_relation.rb +3 -1
  694. data/specs/constraints/bool_enum/channel.rb +3 -1
  695. data/specs/constraints/fixnum_enum/element.rb +3 -1
  696. data/specs/constraints/int/arithmetic.rb +3 -1
  697. data/specs/constraints/int/channel.rb +3 -1
  698. data/specs/constraints/int/linear.rb +3 -1
  699. data/specs/constraints/int/linear_properties.rb +3 -1
  700. data/specs/constraints/int_enum/arithmetic.rb +3 -1
  701. data/specs/constraints/int_enum/channel.rb +3 -1
  702. data/specs/constraints/int_enum/count.rb +3 -1
  703. data/specs/constraints/int_enum/distinct.rb +3 -1
  704. data/specs/constraints/int_enum/element.rb +3 -1
  705. data/specs/constraints/int_enum/sort.rb +3 -1
  706. data/specs/constraints/property_helper.rb +10 -10
  707. data/specs/constraints/reification_sugar.rb +3 -1
  708. data/specs/constraints/selected_set/select.rb +6 -5
  709. data/specs/constraints/selected_set/select_properties.rb +12 -10
  710. data/specs/constraints/set/channel.rb +3 -1
  711. data/specs/constraints/set/domain.rb +4 -4
  712. data/specs/constraints/set/relation.rb +4 -4
  713. data/specs/constraints/set_enum/channel.rb +3 -1
  714. data/specs/constraints/set_enum/distinct.rb +3 -1
  715. data/specs/constraints/set_enum/element.rb +77 -0
  716. data/specs/enum_wrapper.rb +1 -1
  717. data/specs/mixin.rb +78 -0
  718. data/specs/model.rb +5 -5
  719. data/specs/search.rb +20 -14
  720. data/specs/selected_set.rb +3 -3
  721. data/specs/set_elements.rb +2 -2
  722. data/tasks/distribution.rake +25 -4
  723. metadata +739 -602
  724. data/example/money.rb +0 -36
  725. data/ext/gecode-2.1.1/Makefile.dep +0 -7622
  726. data/ext/gecode-2.1.1/Makefile.in +0 -1568
  727. data/ext/gecode-2.1.1/changelog.in +0 -2459
  728. data/ext/gecode-2.1.1/configure +0 -11631
  729. data/ext/gecode-2.1.1/configure.ac +0 -249
  730. data/ext/gecode-2.1.1/configure.ac.in +0 -245
  731. data/ext/gecode-2.1.1/contribs/qecode/Doxyfile +0 -263
  732. data/ext/gecode-2.1.1/contribs/qecode/FirstFailValueHeuristic.cc +0 -82
  733. data/ext/gecode-2.1.1/contribs/qecode/FirstFailValueHeuristic.hh +0 -37
  734. data/ext/gecode-2.1.1/contribs/qecode/Makefile.in.in +0 -162
  735. data/ext/gecode-2.1.1/contribs/qecode/NaiveValueHeuristics.cc +0 -172
  736. data/ext/gecode-2.1.1/contribs/qecode/NaiveValueHeuristics.hh +0 -63
  737. data/ext/gecode-2.1.1/contribs/qecode/SDFVariableHeuristic.cc +0 -37
  738. data/ext/gecode-2.1.1/contribs/qecode/SDFVariableHeuristic.hh +0 -35
  739. data/ext/gecode-2.1.1/contribs/qecode/configure +0 -2264
  740. data/ext/gecode-2.1.1/contribs/qecode/configure.ac +0 -23
  741. data/ext/gecode-2.1.1/contribs/qecode/examples/COMPILING +0 -13
  742. data/ext/gecode-2.1.1/contribs/qecode/examples/MatrixGame.cpp +0 -144
  743. data/ext/gecode-2.1.1/contribs/qecode/examples/NimFibo.cpp +0 -73
  744. data/ext/gecode-2.1.1/contribs/qecode/examples/stress_test.cpp +0 -179
  745. data/ext/gecode-2.1.1/contribs/qecode/extensivecomparator.cc +0 -34
  746. data/ext/gecode-2.1.1/contribs/qecode/extensivecomparator.hh +0 -46
  747. data/ext/gecode-2.1.1/contribs/qecode/implicative.cc +0 -595
  748. data/ext/gecode-2.1.1/contribs/qecode/implicative.hh +0 -184
  749. data/ext/gecode-2.1.1/contribs/qecode/myspace.hh +0 -69
  750. data/ext/gecode-2.1.1/contribs/qecode/qecore.cc +0 -145
  751. data/ext/gecode-2.1.1/contribs/qecode/qecore.hh +0 -247
  752. data/ext/gecode-2.1.1/contribs/qecode/qsolver.cc +0 -168
  753. data/ext/gecode-2.1.1/contribs/qecode/qsolver.hh +0 -73
  754. data/ext/gecode-2.1.1/contribs/qecode/valueHeuristic.hh +0 -91
  755. data/ext/gecode-2.1.1/contribs/qecode/warner.cc +0 -101
  756. data/ext/gecode-2.1.1/contribs/qecode/warner.hh +0 -83
  757. data/ext/gecode-2.1.1/doxygen/doxygen.hh.in +0 -1111
  758. data/ext/gecode-2.1.1/doxygen/reflection.hh +0 -417
  759. data/ext/gecode-2.1.1/gecode.m4 +0 -956
  760. data/ext/gecode-2.1.1/gecode/cpltset.hh +0 -797
  761. data/ext/gecode-2.1.1/gecode/gist/analysiscursor.cc +0 -115
  762. data/ext/gecode-2.1.1/gecode/gist/analysiscursor.hh +0 -77
  763. data/ext/gecode-2.1.1/gecode/gist/drawingcursor.cc +0 -245
  764. data/ext/gecode-2.1.1/gecode/gist/drawingcursor.hh +0 -101
  765. data/ext/gecode-2.1.1/gecode/gist/gecodelogo.icc +0 -522
  766. data/ext/gecode-2.1.1/gecode/gist/mainwindow.cc +0 -254
  767. data/ext/gecode-2.1.1/gecode/gist/mainwindow.hh +0 -86
  768. data/ext/gecode-2.1.1/gecode/gist/node.cc +0 -100
  769. data/ext/gecode-2.1.1/gecode/gist/node.hh +0 -89
  770. data/ext/gecode-2.1.1/gecode/gist/nodecursor.cc +0 -124
  771. data/ext/gecode-2.1.1/gecode/gist/nodecursor.hh +0 -122
  772. data/ext/gecode-2.1.1/gecode/gist/nodecursor.icc +0 -79
  773. data/ext/gecode-2.1.1/gecode/gist/postscript.cc +0 -543
  774. data/ext/gecode-2.1.1/gecode/gist/postscript.hh +0 -56
  775. data/ext/gecode-2.1.1/gecode/gist/preferences.cc +0 -110
  776. data/ext/gecode-2.1.1/gecode/gist/preferences.hh +0 -76
  777. data/ext/gecode-2.1.1/gecode/gist/reflectionhelpers.cc +0 -55
  778. data/ext/gecode-2.1.1/gecode/gist/reflectionhelpers.hh +0 -58
  779. data/ext/gecode-2.1.1/gecode/gist/shapelist.cc +0 -331
  780. data/ext/gecode-2.1.1/gecode/gist/shapelist.hh +0 -140
  781. data/ext/gecode-2.1.1/gecode/gist/spacenode.cc +0 -531
  782. data/ext/gecode-2.1.1/gecode/gist/spacenode.hh +0 -224
  783. data/ext/gecode-2.1.1/gecode/gist/textoutput.cc +0 -114
  784. data/ext/gecode-2.1.1/gecode/gist/treecanvas.cc +0 -1140
  785. data/ext/gecode-2.1.1/gecode/gist/treecanvas.hh +0 -324
  786. data/ext/gecode-2.1.1/gecode/gist/ui_addvisualisationdialog.hh +0 -163
  787. data/ext/gecode-2.1.1/gecode/gist/visualisation/intvaritem.cc +0 -175
  788. data/ext/gecode-2.1.1/gecode/gist/visualisation/intvaritem.hh +0 -71
  789. data/ext/gecode-2.1.1/gecode/gist/visualisation/setvaritem.cc +0 -219
  790. data/ext/gecode-2.1.1/gecode/gist/visualisation/setvaritem.hh +0 -73
  791. data/ext/gecode-2.1.1/gecode/gist/visualisation/vararrayitem.hh +0 -123
  792. data/ext/gecode-2.1.1/gecode/gist/visualnode.cc +0 -303
  793. data/ext/gecode-2.1.1/gecode/gist/visualnode.hh +0 -166
  794. data/ext/gecode-2.1.1/gecode/int.hh +0 -2035
  795. data/ext/gecode-2.1.1/gecode/int/arithmetic.cc +0 -136
  796. data/ext/gecode-2.1.1/gecode/int/arithmetic.hh +0 -440
  797. data/ext/gecode-2.1.1/gecode/int/arithmetic/abs.icc +0 -279
  798. data/ext/gecode-2.1.1/gecode/int/arithmetic/max.icc +0 -253
  799. data/ext/gecode-2.1.1/gecode/int/arithmetic/mult.icc +0 -522
  800. data/ext/gecode-2.1.1/gecode/int/arithmetic/sqr.icc +0 -218
  801. data/ext/gecode-2.1.1/gecode/int/arithmetic/sqrt.icc +0 -138
  802. data/ext/gecode-2.1.1/gecode/int/bool.cc +0 -642
  803. data/ext/gecode-2.1.1/gecode/int/bool/or.icc +0 -1000
  804. data/ext/gecode-2.1.1/gecode/int/branch.cc +0 -301
  805. data/ext/gecode-2.1.1/gecode/int/branch.hh +0 -576
  806. data/ext/gecode-2.1.1/gecode/int/branch/select-val.icc +0 -338
  807. data/ext/gecode-2.1.1/gecode/int/channel.cc +0 -114
  808. data/ext/gecode-2.1.1/gecode/int/channel.hh +0 -259
  809. data/ext/gecode-2.1.1/gecode/int/channel/dom.icc +0 -347
  810. data/ext/gecode-2.1.1/gecode/int/channel/val.icc +0 -276
  811. data/ext/gecode-2.1.1/gecode/int/circuit.hh +0 -175
  812. data/ext/gecode-2.1.1/gecode/int/circuit/base.icc +0 -271
  813. data/ext/gecode-2.1.1/gecode/int/circuit/val.icc +0 -122
  814. data/ext/gecode-2.1.1/gecode/int/count.hh +0 -487
  815. data/ext/gecode-2.1.1/gecode/int/count/int.icc +0 -619
  816. data/ext/gecode-2.1.1/gecode/int/count/rel.icc +0 -144
  817. data/ext/gecode-2.1.1/gecode/int/count/view.icc +0 -449
  818. data/ext/gecode-2.1.1/gecode/int/cumulatives.hh +0 -141
  819. data/ext/gecode-2.1.1/gecode/int/cumulatives/val.icc +0 -429
  820. data/ext/gecode-2.1.1/gecode/int/distinct.hh +0 -341
  821. data/ext/gecode-2.1.1/gecode/int/distinct/dom.icc +0 -750
  822. data/ext/gecode-2.1.1/gecode/int/distinct/ter-dom.icc +0 -136
  823. data/ext/gecode-2.1.1/gecode/int/element.hh +0 -239
  824. data/ext/gecode-2.1.1/gecode/int/element/int.icc +0 -441
  825. data/ext/gecode-2.1.1/gecode/int/element/view.icc +0 -584
  826. data/ext/gecode-2.1.1/gecode/int/exception.icc +0 -163
  827. data/ext/gecode-2.1.1/gecode/int/extensional.hh +0 -415
  828. data/ext/gecode-2.1.1/gecode/int/extensional/dfa.cc +0 -565
  829. data/ext/gecode-2.1.1/gecode/int/extensional/tuple-set.cc +0 -311
  830. data/ext/gecode-2.1.1/gecode/int/gcc.hh +0 -329
  831. data/ext/gecode-2.1.1/gecode/int/gcc/bnd.icc +0 -660
  832. data/ext/gecode-2.1.1/gecode/int/gcc/dom.icc +0 -531
  833. data/ext/gecode-2.1.1/gecode/int/gcc/val.icc +0 -400
  834. data/ext/gecode-2.1.1/gecode/int/int-set.cc +0 -153
  835. data/ext/gecode-2.1.1/gecode/int/int-set.icc +0 -191
  836. data/ext/gecode-2.1.1/gecode/int/linear-bool.cc +0 -220
  837. data/ext/gecode-2.1.1/gecode/int/linear-int.cc +0 -240
  838. data/ext/gecode-2.1.1/gecode/int/linear.hh +0 -1849
  839. data/ext/gecode-2.1.1/gecode/int/linear/bool-post.cc +0 -433
  840. data/ext/gecode-2.1.1/gecode/int/linear/int-bin.icc +0 -605
  841. data/ext/gecode-2.1.1/gecode/int/linear/int-dom.icc +0 -539
  842. data/ext/gecode-2.1.1/gecode/int/linear/int-post.cc +0 -493
  843. data/ext/gecode-2.1.1/gecode/int/rel.cc +0 -431
  844. data/ext/gecode-2.1.1/gecode/int/rel.hh +0 -657
  845. data/ext/gecode-2.1.1/gecode/int/rel/eq.icc +0 -848
  846. data/ext/gecode-2.1.1/gecode/int/rel/lex.icc +0 -248
  847. data/ext/gecode-2.1.1/gecode/int/rel/nq.icc +0 -269
  848. data/ext/gecode-2.1.1/gecode/int/sorted.cc +0 -91
  849. data/ext/gecode-2.1.1/gecode/int/sorted.hh +0 -117
  850. data/ext/gecode-2.1.1/gecode/int/sorted/matching.icc +0 -182
  851. data/ext/gecode-2.1.1/gecode/int/sorted/narrowing.icc +0 -257
  852. data/ext/gecode-2.1.1/gecode/int/sorted/order.icc +0 -208
  853. data/ext/gecode-2.1.1/gecode/int/sorted/propagate.icc +0 -669
  854. data/ext/gecode-2.1.1/gecode/int/sorted/sortsup.icc +0 -596
  855. data/ext/gecode-2.1.1/gecode/int/var-imp.icc +0 -745
  856. data/ext/gecode-2.1.1/gecode/int/var-imp/bool.cc +0 -104
  857. data/ext/gecode-2.1.1/gecode/int/var-imp/int.cc +0 -407
  858. data/ext/gecode-2.1.1/gecode/int/var/bool.icc +0 -126
  859. data/ext/gecode-2.1.1/gecode/int/var/int.icc +0 -151
  860. data/ext/gecode-2.1.1/gecode/int/view.icc +0 -1894
  861. data/ext/gecode-2.1.1/gecode/iter.hh +0 -90
  862. data/ext/gecode-2.1.1/gecode/iter/values-minus.icc +0 -130
  863. data/ext/gecode-2.1.1/gecode/kernel.hh +0 -182
  864. data/ext/gecode-2.1.1/gecode/kernel/branching.icc +0 -447
  865. data/ext/gecode-2.1.1/gecode/kernel/core.cc +0 -473
  866. data/ext/gecode-2.1.1/gecode/kernel/core.icc +0 -2295
  867. data/ext/gecode-2.1.1/gecode/kernel/memory-manager.icc +0 -458
  868. data/ext/gecode-2.1.1/gecode/kernel/reflection.cc +0 -921
  869. data/ext/gecode-2.1.1/gecode/kernel/reflection.icc +0 -1012
  870. data/ext/gecode-2.1.1/gecode/kernel/var-imp.icc +0 -433
  871. data/ext/gecode-2.1.1/gecode/kernel/var-map.cc +0 -269
  872. data/ext/gecode-2.1.1/gecode/kernel/var-map.icc +0 -227
  873. data/ext/gecode-2.1.1/gecode/kernel/var-traits.icc +0 -72
  874. data/ext/gecode-2.1.1/gecode/kernel/var-type.icc +0 -915
  875. data/ext/gecode-2.1.1/gecode/kernel/var.icc +0 -120
  876. data/ext/gecode-2.1.1/gecode/kernel/view.icc +0 -611
  877. data/ext/gecode-2.1.1/gecode/minimodel.hh +0 -1165
  878. data/ext/gecode-2.1.1/gecode/minimodel/arithmetic.cc +0 -179
  879. data/ext/gecode-2.1.1/gecode/search.hh +0 -752
  880. data/ext/gecode-2.1.1/gecode/search/reco-stack.icc +0 -237
  881. data/ext/gecode-2.1.1/gecode/serialization.hh +0 -149
  882. data/ext/gecode-2.1.1/gecode/serialization/boost.cc +0 -78
  883. data/ext/gecode-2.1.1/gecode/serialization/javascript.cc +0 -340
  884. data/ext/gecode-2.1.1/gecode/serialization/register.cc +0 -8142
  885. data/ext/gecode-2.1.1/gecode/set.hh +0 -970
  886. data/ext/gecode-2.1.1/gecode/set/projectors.hh +0 -438
  887. data/ext/gecode-2.1.1/gecode/set/projectors/formula.cc +0 -312
  888. data/ext/gecode-2.1.1/gecode/set/rel-op/common.icc +0 -557
  889. data/ext/gecode-2.1.1/gecode/set/rel-op/inter.icc +0 -409
  890. data/ext/gecode-2.1.1/gecode/set/rel/re-subset.icc +0 -172
  891. data/ext/gecode-2.1.1/gecode/set/select.cc +0 -135
  892. data/ext/gecode-2.1.1/gecode/set/select.hh +0 -233
  893. data/ext/gecode-2.1.1/gecode/set/select/disjoint.cc +0 -308
  894. data/ext/gecode-2.1.1/gecode/set/select/disjoint.icc +0 -75
  895. data/ext/gecode-2.1.1/gecode/set/select/idxarray.hh +0 -113
  896. data/ext/gecode-2.1.1/gecode/set/select/idxarray.icc +0 -155
  897. data/ext/gecode-2.1.1/gecode/set/select/inter.icc +0 -349
  898. data/ext/gecode-2.1.1/gecode/set/select/union.icc +0 -371
  899. data/ext/gecode-2.1.1/gecode/set/select/unionConst.icc +0 -334
  900. data/ext/gecode-2.1.1/gecode/set/var-imp/set.cc +0 -214
  901. data/ext/gecode-2.1.1/gecode/set/var/set.icc +0 -303
  902. data/ext/gecode-2.1.1/gecode/set/view.icc +0 -1503
  903. data/ext/gecode-2.1.1/gecode/set/view/complement.icc +0 -629
  904. data/ext/gecode-2.1.1/gecode/support/block-allocator.icc +0 -158
  905. data/ext/gecode-2.1.1/gecode/support/config.icc.in +0 -80
  906. data/ext/gecode-2.1.1/gecode/support/sentinel-stack.icc +0 -122
  907. data/ext/gecode-2.1.1/gecode/support/symbol.cc +0 -226
  908. data/ext/gecode-2.1.1/gecode/support/symbol.icc +0 -130
  909. data/ext/gecode-2.1.1/misc/gecode-gist.pc.in +0 -45
  910. data/ext/gecode-2.1.1/misc/gecode-minimodel.pc.in +0 -45
  911. data/ext/gecode-2.1.1/misc/gecode-search.pc.in +0 -45
  912. data/ext/gecode-2.1.1/misc/gecode-serialization.pc.in +0 -45
  913. data/ext/gecode-2.1.1/misc/gecode.pc.in +0 -45
  914. data/ext/gecode-2.1.1/misc/genstatistics.perl +0 -178
  915. data/ext/gecode-2.1.1/misc/genvariables.perl +0 -905
  916. data/lib/gecoder/interface/constraints/set_enum/select.rb +0 -79
  917. data/lib/gecoder/interface/model.rb +0 -453
  918. data/lib/gecoder/interface/model_sugar.rb +0 -84
  919. data/specs/constraints/set_enum/select.rb +0 -73
@@ -0,0 +1,2311 @@
1
+ /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Main authors:
4
+ * Christian Schulte <schulte@gecode.org>
5
+ * Guido Tack <tack@gecode.org>
6
+ * Mikael Lagerkvist <lagerkvist@gecode.org>
7
+ *
8
+ * Copyright:
9
+ * Christian Schulte, 2002
10
+ * Guido Tack, 2003
11
+ * Mikael Lagerkvist, 2006
12
+ *
13
+ * Bugfixes provided by:
14
+ * Alexander Samoilov <alexander_samoilov@yahoo.com>
15
+ *
16
+ * Last modified:
17
+ * $Date: 2008-07-11 10:27:28 +0200 (Fri, 11 Jul 2008) $ by $Author: tack $
18
+ * $Revision: 7332 $
19
+ *
20
+ * This file is part of Gecode, the generic constraint
21
+ * development environment:
22
+ * http://www.gecode.org
23
+ *
24
+ * Permission is hereby granted, free of charge, to any person obtaining
25
+ * a copy of this software and associated documentation files (the
26
+ * "Software"), to deal in the Software without restriction, including
27
+ * without limitation the rights to use, copy, modify, merge, publish,
28
+ * distribute, sublicense, and/or sell copies of the Software, and to
29
+ * permit persons to whom the Software is furnished to do so, subject to
30
+ * the following conditions:
31
+ *
32
+ * The above copyright notice and this permission notice shall be
33
+ * included in all copies or substantial portions of the Software.
34
+ *
35
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
36
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
37
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
38
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
39
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
40
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
41
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
42
+ *
43
+ */
44
+
45
+ namespace Gecode {
46
+
47
+ class Space;
48
+
49
+ /**
50
+ * \defgroup FuncSupportShared Support for shared objects and handles
51
+ *
52
+ * Shared handles provide access to reference-counted objects
53
+ * used by entities inside spaces. In particular, they support
54
+ * updates with and without sharing. An update with sharing
55
+ * just updates the handle. An update without sharing creates
56
+ * a single copy per space during updating.
57
+ *
58
+ * \ingroup FuncSupport
59
+ */
60
+
61
+ /**
62
+ * \brief The shared handle
63
+ *
64
+ * Shared handles must inherit from this base class where
65
+ * \a Object must be a subclass of SharedObject. Shared
66
+ * handles support that the handle has no object it currently
67
+ * refers to.
68
+ *
69
+ * \ingroup FuncSupportShared
70
+ */
71
+ class SharedHandle {
72
+ public:
73
+ /**
74
+ * \brief The shared object
75
+ *
76
+ * Shared objects must inherit from this base class.
77
+ *
78
+ * \ingroup FuncSupportShared
79
+ */
80
+ class Object {
81
+ friend class Space;
82
+ friend class SharedHandle;
83
+ private:
84
+ /// The counter used for reference counting
85
+ unsigned int use_cnt;
86
+ /// The next shared object collected during copying
87
+ Object* next;
88
+ /// The forwarding pointer used for forwarding
89
+ Object* fwd;
90
+ public:
91
+ /// Initialize
92
+ Object(void);
93
+ /// Return fresh copy for unshared update
94
+ virtual Object* copy(void) const = 0;
95
+ /// Delete shared object
96
+ virtual ~Object(void);
97
+ /// Allocate memory from heap
98
+ static void* operator new(size_t s);
99
+ /// Free memory allocated from heap
100
+ static void operator delete(void* p);
101
+ };
102
+ private:
103
+ /// The shared object
104
+ Object* o;
105
+ /// Subscribe handle to object
106
+ void subscribe(void);
107
+ /// Cancel subscription of handle to object
108
+ void cancel(void);
109
+ public:
110
+ /// Create shared handle with no object pointing to
111
+ SharedHandle(void);
112
+ /// Create shared handle that points to shared object \a so
113
+ SharedHandle(Object* so);
114
+ /// Copy constructor maintaining reference count
115
+ SharedHandle(const SharedHandle& sh);
116
+ /// Assignment operator mainitaining reference count
117
+ SharedHandle& operator=(const SharedHandle& sh);
118
+ /// Updating during cloning
119
+ void update(Space* home, bool share, SharedHandle& sh);
120
+ /// Destructor that maintains reference count
121
+ ~SharedHandle(void);
122
+ protected:
123
+ /// Access to the shared object
124
+ Object* object(void) const;
125
+ /// Modify shared object
126
+ void object(Object* n);
127
+ };
128
+
129
+
130
+ /**
131
+ * \defgroup TaskVarMEPC Generic modification events and propagation conditions
132
+ *
133
+ * Predefined modification events must be taken into account
134
+ * by variable types.
135
+ * \ingroup TaskVar
136
+ */
137
+ //@{
138
+ /// Type for modification events
139
+ typedef int ModEvent;
140
+
141
+ /// Generic modification event: failed variable
142
+ const ModEvent ME_GEN_FAILED = -1;
143
+ /// Generic modification event: no modification
144
+ const ModEvent ME_GEN_NONE = 0;
145
+ /// Generic modification event: variable is assigned a value
146
+ const ModEvent ME_GEN_ASSIGNED = 1;
147
+
148
+ /// Type for propagation conditions
149
+ typedef int PropCond;
150
+ /// Propagation condition to be ignored (convenience)
151
+ const PropCond PC_GEN_NONE = -1;
152
+ /// Propagation condition for an assigned variable
153
+ const PropCond PC_GEN_ASSIGNED = 0;
154
+ //@}
155
+
156
+ /**
157
+ * \brief Modification event deltas
158
+ *
159
+ * Modification event deltas are used by propagators. A
160
+ * propagator stores a modification event for each variable type.
161
+ * They can be accessed through a variable or a view from a given
162
+ * propagator. They can be constructed from a given modevent by
163
+ * a variable or view.
164
+ * \ingroup TaskActor
165
+ */
166
+ typedef int ModEventDelta;
167
+
168
+ }
169
+
170
+ #include "gecode/kernel/var-type.icc"
171
+
172
+ namespace Gecode {
173
+
174
+ /// Configuration class for variable implementations without index structure
175
+ class NoIdxVarImpConf {
176
+ public:
177
+ /// Index for update
178
+ static const int idx_c = -1;
179
+ /// Index for disposal
180
+ static const int idx_d = -1;
181
+ /// Maximal propagation condition
182
+ static const PropCond pc_max = PC_GEN_ASSIGNED;
183
+ /// Freely available bits
184
+ static const int free_bits = 0;
185
+ /// Start of bits for modification event delta
186
+ static const int med_fst = 0;
187
+ /// End of bits for modification event delta
188
+ static const int med_lst = 0;
189
+ /// Bitmask for modification event delta
190
+ static const int med_mask = 0;
191
+ /// Combine modification events \a me1 and \a me2
192
+ static Gecode::ModEvent me_combine(ModEvent me1, ModEvent me2);
193
+ /// Update modification even delta \a med by \a me, return true on change
194
+ static bool med_update(ModEventDelta& med, ModEvent me);
195
+ /// Variable type identifier for reflection
196
+ static GECODE_KERNEL_EXPORT const Support::Symbol vti;
197
+ };
198
+
199
+ forceinline ModEvent
200
+ NoIdxVarImpConf::me_combine(ModEvent, ModEvent) {
201
+ GECODE_NEVER; return 0;
202
+ }
203
+ forceinline bool
204
+ NoIdxVarImpConf::med_update(ModEventDelta&, ModEvent) {
205
+ GECODE_NEVER; return false;
206
+ }
207
+
208
+
209
+ /*
210
+ * These are the classes of interest
211
+ *
212
+ */
213
+ class ActorLink;
214
+ class Actor;
215
+ class Propagator;
216
+ class Advisor;
217
+ template <class A> class Council;
218
+ template <class A> class Advisors;
219
+ template <class VIC> class VarImp;
220
+
221
+
222
+ /*
223
+ * Variable implementations
224
+ *
225
+ */
226
+
227
+ /**
228
+ * \brief Base-class for variable implementations
229
+ *
230
+ * Serves as base-class that can be used without having to know any
231
+ * template arguments.
232
+ * \ingroup TaskVar
233
+ */
234
+ class VarImpBase {};
235
+
236
+ /**
237
+ * \brief Base class for %Variable type disposer
238
+ *
239
+ * Controls disposal of variable implementations.
240
+ * \ingroup TaskVar
241
+ */
242
+ class GECODE_VTABLE_EXPORT VarDisposerBase {
243
+ public:
244
+ /// Dispose list of variable implementations starting at \a x
245
+ GECODE_KERNEL_EXPORT virtual void dispose(Space* home, VarImpBase* x);
246
+ /// Destructor (not used)
247
+ GECODE_KERNEL_EXPORT virtual ~VarDisposerBase(void);
248
+ };
249
+
250
+ /**
251
+ * \brief %Variable type disposer
252
+ *
253
+ * Controls disposal of variables.
254
+ * \ingroup TaskVar
255
+ */
256
+ template <class VarType>
257
+ class VarDisposer : public VarDisposerBase {
258
+ public:
259
+ /// Constructor (registers disposer with kernel)
260
+ VarDisposer(void);
261
+ /// Dispose list of variable implementations starting at \a x
262
+ virtual void dispose(Space* home, VarImpBase* x);
263
+ };
264
+
265
+ /// Generic domain change information to be supplied to advisors
266
+ class Delta {
267
+ template <class VIC> friend class VarImp;
268
+ private:
269
+ /// Modification event
270
+ ModEvent me;
271
+ public:
272
+ /// Return modification event
273
+ ModEvent modevent(void) const;
274
+ };
275
+
276
+ /**
277
+ * \brief Base-class for variable implementations
278
+ *
279
+ * Implements variable implementation for variable implementation
280
+ * configuration of type \a VIC.
281
+ * \ingroup TaskVar
282
+ */
283
+ template <class VIC>
284
+ class VarImp : public VarImpBase {
285
+ friend class Space;
286
+ friend class Propagator;
287
+ template <class VarType> friend class VarDisposer;
288
+ private:
289
+ /// Index for update
290
+ static const int idx_c = VIC::idx_c;
291
+ /// Index for disposal
292
+ static const int idx_d = VIC::idx_d;
293
+ /// Number of freely available bits
294
+ static const int free_bits = VIC::free_bits;
295
+ /// Number of free subscription entries
296
+ unsigned int free_and_bits;
297
+ /// Maximal propagation condition
298
+ static const Gecode::PropCond pc_max = VIC::pc_max;
299
+ /**
300
+ * \brief Subscribed actors (idx[pc])
301
+ *
302
+ * The entries from idx[0] to idx[pc_max+1] are propagators,
303
+ * where the entries between idx[pc] and idx[pc+1] are
304
+ * the propagators that have subscribed with propagation condition pc.
305
+ *
306
+ * The entries between idx[pc_max+1] and idx[pc_max+2] are the
307
+ * advisors subscribed to the variable implementation.
308
+ *
309
+ * During cloning, the first two entries in the original are used
310
+ * as follows (the original values are stored in the copy).
311
+ * - idx[0] is used as forwarding pointer (a marked pointer)
312
+ * - idx[1] points to the next copied variable
313
+ */
314
+ ActorLink** idx[pc_max+3];
315
+
316
+ /**
317
+ * \brief Update copied variable \a x
318
+ *
319
+ * The argument \a sub gives the memory area where subscriptions are
320
+ * to be stored.
321
+ */
322
+ void update(VarImp* x, ActorLink**& sub);
323
+ /**
324
+ * \brief Update all copied variables of this type
325
+ *
326
+ * The argument \a sub gives the memory area where subscriptions are
327
+ * to be stored.
328
+ */
329
+ static void update(Space* home, ActorLink**& sub);
330
+
331
+ /// Enter propagator or advisor to subscription array
332
+ void enter(Space* home, ActorLink* a, PropCond pc);
333
+ /// Resize subscription array
334
+ void resize(Space* home);
335
+ /// Remove propagator or advisor from subscription array
336
+ void remove(Space* home, ActorLink* a, PropCond pc);
337
+
338
+ protected:
339
+ #ifdef GECODE_HAS_VAR_DISPOSE
340
+ /// Return reference to variables (dispose)
341
+ static VarImp<VIC>* vars_d(Space* home);
342
+ /// Set reference to variables (dispose)
343
+ static void vars_d(Space* home, VarImp<VIC>* x);
344
+ #endif
345
+
346
+ public:
347
+ /// Creation
348
+ VarImp(Space* home);
349
+ /// Creation of static instances
350
+ VarImp(void);
351
+
352
+ /// \name Dependencies
353
+ //@{
354
+ /** \brief Subscribe propagator \a p with propagation condition \a pc
355
+ *
356
+ * In case \a schedule is false, the propagator is just subscribed but
357
+ * not scheduled for execution (this must be used when creating
358
+ * subscriptions during propagation).
359
+ *
360
+ * In case the variable is assigned (that is, \a assigned is
361
+ * true), the subscribing propagator is scheduled for execution.
362
+ * Otherwise, the propagator subscribes and is scheduled for execution
363
+ * with modification event \a me provided that \a pc is different
364
+ * from \a PC_GEN_ASSIGNED.
365
+ */
366
+ void subscribe(Space* home, Propagator* p, PropCond pc,
367
+ bool assigned, ModEvent me, bool schedule);
368
+ /** \brief Cancel subscription of propagator \a p with propagation condition \a pc
369
+ *
370
+ * If the variable is assigned, \a assigned must be true.
371
+ *
372
+ */
373
+ void cancel(Space* home, Propagator* p, PropCond pc,
374
+ bool assigned);
375
+ /** \brief Subscribe advisor \a a to variable
376
+ *
377
+ * The advisor \a a is only subscribed if \a assigned is false.
378
+ *
379
+ */
380
+ void subscribe(Space* home, Advisor* a, bool assigned);
381
+ /** \brief Cancel subscription of advisor \a a
382
+ *
383
+ * If the variable is assigned, \a assigned must be true.
384
+ *
385
+ */
386
+ void cancel(Space* home, Advisor* p, bool assigned);
387
+ /// Cancel all subscriptions when variable implementation is assigned
388
+ void cancel(Space* home);
389
+ /**
390
+ * \brief Return degree (number of subscribed propagators and advisors)
391
+ *
392
+ * Note that the degree of a variable implementation is not available
393
+ * during copying.
394
+ */
395
+ unsigned int degree(void) const;
396
+ /**
397
+ * \brief Run advisors when variable implementation has been modified with modification event \a me and domain change \a d
398
+ *
399
+ * Returns false if an advisor has failed.
400
+ */
401
+ bool advise(Space* home, ModEvent me, Delta* d);
402
+ //@}
403
+
404
+ /// \name Cloning variables
405
+ //@{
406
+ /// Constructor for cloning
407
+ VarImp(Space* home, bool share, VarImp& x);
408
+ /// Is variable already copied
409
+ bool copied(void) const;
410
+ /// Use forward pointer if variable already copied
411
+ VarImp* forward(void) const;
412
+ /// Return next copied variable
413
+ VarImp* next(void) const;
414
+ //@}
415
+
416
+ /// \name Variable implementation-dependent propagator support
417
+ //@{
418
+ /// Schedule propagator \a p with modification event \a me
419
+ static void schedule(Space* home, Propagator* p, ModEvent me);
420
+ /// Project modification event for this variable type from \a med
421
+ static ModEvent me(ModEventDelta med);
422
+ /// Translate modification event \a me into modification event delta
423
+ static ModEventDelta med(ModEvent me);
424
+ /// Combine modifications events \a me1 and \a me2
425
+ static ModEvent me_combine(ModEvent me1, ModEvent me2);
426
+ //@}
427
+
428
+ /// Provide access to free bits
429
+ unsigned int bits(void) const;
430
+ /// Provide access to free bits
431
+ unsigned int& bits(void);
432
+
433
+ protected:
434
+ /// Schedule subscribed propagators
435
+ void schedule(Space* home, PropCond pc1, PropCond pc2, ModEvent me);
436
+
437
+ public:
438
+ /// \name Memory management
439
+ //@{
440
+ /// Allocate memory from space
441
+ static void* operator new(size_t,Space*);
442
+ /// Return memory to space
443
+ static void operator delete(void*,Space*);
444
+ /// Needed for exceptions
445
+ static void operator delete(void*);
446
+ //@}
447
+
448
+ /// \name Reflection
449
+ //@{
450
+ /// Variable type identifier
451
+ static const Support::Symbol vti;
452
+ //@}
453
+
454
+ };
455
+
456
+ template <class VIC>
457
+ const Support::Symbol
458
+ VarImp<VIC>::vti = VIC::vti;
459
+
460
+
461
+ namespace Reflection {
462
+ class ActorSpecIter;
463
+ class ActorSpec;
464
+ class BranchingSpec;
465
+ class VarMap;
466
+ }
467
+
468
+ /**
469
+ * \defgroup TaskActorStatus Status of constraint propagation and branching commit
470
+ * Note that the enum values starting with a double underscore should not
471
+ * be used directly. Instead, use the provided functions with the same
472
+ * name without leading underscores.
473
+ *
474
+ * \ingroup TaskActor
475
+ */
476
+ enum ExecStatus {
477
+ __ES_SUBSUMED = -2, ///< Internal: propagator is subsumed, do not use
478
+ ES_FAILED = -1, ///< Execution has resulted in failure
479
+ ES_NOFIX = 0, ///< Propagation has not computed fixpoint
480
+ ES_OK = 0, ///< Execution is okay
481
+ ES_FIX = 1, ///< Propagation has computed fixpoint
482
+ __ES_PARTIAL = 2 ///< Internal: propagator has computed partial fixpoint, do not use
483
+ };
484
+
485
+ /**
486
+ * \brief Classification of propagation cost
487
+ * \ingroup TaskActor
488
+ */
489
+ enum PropCost {
490
+ PC_CRAZY_LO = 0, ///< Exponential complexity, cheap
491
+ PC_CRAZY_HI = 0, ///< Exponential complexity, expensive
492
+ PC_CUBIC_LO = 1, ///< Cubic complexity, cheap
493
+ PC_CUBIC_HI = 1, ///< Cubic complexity, expensive
494
+ PC_QUADRATIC_LO = 2, ///< Quadratic complexity, cheap
495
+ PC_QUADRATIC_HI = 2, ///< Quadratic complexity, expensive
496
+ PC_LINEAR_HI = 3, ///< Linear complexity, expensive
497
+ PC_LINEAR_LO = 4, ///< Linear complexity, cheap
498
+ PC_TERNARY_HI = 5, ///< Three variables, expensive
499
+ PC_BINARY_HI = 6, ///< Two variables, expensive
500
+ PC_TERNARY_LO = 6, ///< Three variables, cheap
501
+ PC_BINARY_LO = 7, ///< Two variables, cheap
502
+ PC_UNARY_LO = 7, ///< Only single variable, cheap
503
+ PC_UNARY_HI = 7, ///< Only single variable, expensive
504
+ PC_MAX = 7 ///< Maximal cost value
505
+ };
506
+
507
+ /**
508
+ * \brief Double-linked list for actors
509
+ *
510
+ * Used to maintain which actors belong to a space and also
511
+ * (for propagators) to organize actors in the queue of
512
+ * waiting propagators.
513
+ */
514
+ class ActorLink {
515
+ friend class Actor;
516
+ friend class Propagator;
517
+ friend class Advisor;
518
+ friend class Branching;
519
+ friend class Space;
520
+ template <class VIC> friend class VarImp;
521
+ private:
522
+ ActorLink* _next; ActorLink* _prev;
523
+ public:
524
+ //@{
525
+ /// Routines for double-linked list
526
+ ActorLink* prev(void) const; void prev(ActorLink*);
527
+ ActorLink* next(void) const; void next(ActorLink*);
528
+ ActorLink** next_ref(void);
529
+ //@}
530
+
531
+ /// Initialize links (self-linked)
532
+ void init(void);
533
+ /// Remove from predecessor and successor
534
+ void unlink(void);
535
+ /// Insert \a al directly after this
536
+ void head(ActorLink* al);
537
+ /// Insert \a al directly before this
538
+ void tail(ActorLink* al);
539
+ /// Static cast for a non-null pointer (to give a hint to optimizer)
540
+ template <class T> static ActorLink* cast(T* a);
541
+ /// Static cast for a non-null pointer (to give a hint to optimizer)
542
+ template <class T> static const ActorLink* cast(const T* a);
543
+ };
544
+
545
+
546
+ /**
547
+ * \brief Base-class for both propagators and branchings
548
+ * \ingroup TaskActor
549
+ */
550
+ class GECODE_VTABLE_EXPORT Actor : private ActorLink {
551
+ friend class ActorLink;
552
+ friend class Space;
553
+ friend class Propagator;
554
+ friend class Advisor;
555
+ friend class Branching;
556
+ friend class Reflection::ActorSpecIter;
557
+ template <class VIC> friend class VarImp;
558
+ template <class A> friend class Council;
559
+ private:
560
+ /// Static cast for a non-null pointer (to give a hint to optimizer)
561
+ static Actor* cast(ActorLink* al);
562
+ /// Static cast for a non-null pointer (to give a hint to optimizer)
563
+ static const Actor* cast(const ActorLink* al);
564
+ public:
565
+ /// Create copy
566
+ virtual Actor* copy(Space*,bool) = 0;
567
+
568
+ /// \name Memory management
569
+ //@{
570
+ /// Report size occupied by additionally datastructures
571
+ GECODE_KERNEL_EXPORT
572
+ virtual size_t allocated(void) const;
573
+ /// Delete actor and return its size
574
+ GECODE_KERNEL_EXPORT
575
+ virtual size_t dispose(Space* home);
576
+ /// Register actor for forced dispose when \a home is deleted
577
+ void force(Space* home);
578
+ /// Deregister actor for forced dispose
579
+ void unforce(Space* home);
580
+ /// Allocate memory from space
581
+ static void* operator new(size_t s, Space* home);
582
+ /// No-op for exceptions
583
+ static void operator delete(void* p, Space* home);
584
+ /// Return specification for this actor given a variable map \a m
585
+ GECODE_KERNEL_EXPORT
586
+ virtual Reflection::ActorSpec spec(const Space* home,
587
+ Reflection::VarMap& m) const;
588
+ private:
589
+ #ifndef __GNUC__
590
+ /// Not used (uses dispose instead)
591
+ static void operator delete(void* p);
592
+ #endif
593
+ /// Not used
594
+ static void* operator new(size_t s);
595
+ //@}
596
+ #ifdef __GNUC__
597
+ public:
598
+ /// To avoid warnings from GCC
599
+ GECODE_KERNEL_EXPORT virtual ~Actor(void);
600
+ /// Not used (uses dispose instead)
601
+ static void operator delete(void* p);
602
+ #endif
603
+ };
604
+
605
+
606
+ /**
607
+ * \brief %Propagator \a p is subsumed
608
+ *
609
+ * The size of the propagator is \a s.
610
+ *
611
+ * Note that the propagator must be subsumed and also disposed. So
612
+ * in general, there should be code such as
613
+ * \code return ES_SUBSUMED(this,dispose(home)) \endcode.
614
+ *
615
+ * However, in case the propagator has nothing to dispose (all its
616
+ * views are assigned and no external resources) it is sufficient
617
+ * to do
618
+ * \code return ES_SUBSUMED(this,sizeof(*this)) \endcode.
619
+ *
620
+ * \warning Has a side-effect on the propagator. Overwrites
621
+ * the modification event delta of a propagator.
622
+ * Use only directly with returning from propagation.
623
+ * \ingroup TaskActorStatus
624
+ */
625
+ ExecStatus ES_SUBSUMED(Propagator* p, size_t s);
626
+ /**
627
+ * \brief %Propagator \a p is subsumed
628
+ *
629
+ * First disposes the propagator and then returns subsumption.
630
+ *
631
+ * \warning Has a side-effect on the propagator. Overwrites
632
+ * the modification event delta of a propagator.
633
+ * Use only directly with returning from propagation.
634
+ * \ingroup TaskActorStatus
635
+ */
636
+ ExecStatus ES_SUBSUMED(Propagator* p, Space* home);
637
+ /**
638
+ * \brief %Propagator \a p has computed partial fixpoint
639
+ *
640
+ * %Set modification event delta to \a med and schedule propagator
641
+ * accordingly.
642
+ *
643
+ * \warning Has a side-effect on the propagator.
644
+ * Use only directly with returning from propagation.
645
+ * \ingroup TaskActorStatus
646
+ */
647
+ ExecStatus ES_FIX_PARTIAL(Propagator* p, ModEventDelta med);
648
+ /**
649
+ * \brief %Propagator \a p has not computed partial fixpoint
650
+ *
651
+ * Combine current modification event delta with \a and schedule
652
+ * propagator accordingly.
653
+ *
654
+ * \warning Has a side-effect on the propagator.
655
+ * Use only directly with returning from propagation.
656
+ * \ingroup TaskActorStatus
657
+ */
658
+ ExecStatus ES_NOFIX_PARTIAL(Propagator* p, ModEventDelta med);
659
+
660
+ /**
661
+ * \brief Base-class for propagators
662
+ * \ingroup TaskActor
663
+ */
664
+ class GECODE_VTABLE_EXPORT Propagator : public Actor {
665
+ friend class ActorLink;
666
+ friend class Space;
667
+ template <class VIC> friend class VarImp;
668
+ friend ExecStatus ES_SUBSUMED(Propagator*, size_t);
669
+ friend ExecStatus ES_SUBSUMED(Propagator*, Space*);
670
+ friend ExecStatus ES_FIX_PARTIAL(Propagator*, ModEventDelta);
671
+ friend ExecStatus ES_NOFIX_PARTIAL(Propagator*, ModEventDelta);
672
+ friend class Advisor;
673
+ template <class A> friend class Council;
674
+ private:
675
+ union {
676
+ /// A set of modification events (used during propagation)
677
+ ModEventDelta med;
678
+ /// The size of the propagator (used during subsumption)
679
+ size_t size;
680
+ /// A list of advisors (used during cloning)
681
+ Gecode::ActorLink* advisors;
682
+ } u;
683
+ /// Static cast for a non-null pointer (to give a hint to optimizer)
684
+ static Propagator* cast(ActorLink* al);
685
+ /// Static cast for a non-null pointer (to give a hint to optimizer)
686
+ static const Propagator* cast(const ActorLink* al);
687
+ protected:
688
+ /// Constructor for creation
689
+ Propagator(Space* home);
690
+ /// Constructor for cloning \a p
691
+ Propagator(Space* home, bool share, Propagator& p);
692
+
693
+ public:
694
+ /// \name Propagation
695
+ //@{
696
+ /**
697
+ * \brief Propagation function
698
+ *
699
+ * The propagation function must return an execution status as
700
+ * follows:
701
+ * - ES_FAILED: the propagator has detected failure
702
+ * - ES_NOFIX: the propagator has done propagation
703
+ * - ES_FIX: the propagator has done propagation and has computed
704
+ * a fixpoint. That is, running the propagator immediately
705
+ * again will do nothing.
706
+ *
707
+ * Apart from the above values, a propagator can return
708
+ * the result from calling one of the functions
709
+ * - ES_SUBSUMED: the propagator is subsumed and has been already
710
+ * deleted.
711
+ * - ES_NOFIX_PARTIAL: the propagator has consumed some of its
712
+ * propagation events.
713
+ * - ES_FIX_PARTIAL: the propagator has consumed some of its
714
+ * propagation events and with respect to these events is
715
+ * at fixpoint
716
+ * For more details, see the individual functions.
717
+ *
718
+ */
719
+ virtual ExecStatus propagate(Space* home, ModEventDelta med) = 0;
720
+ /// Cost function
721
+ virtual PropCost cost(ModEventDelta med) const = 0;
722
+ /**
723
+ * \brief Advise function
724
+ *
725
+ * The advisor is passed as argument \a a.
726
+ *
727
+ * A propagator must specialize this advise function, if it
728
+ * uses advisors. The advise function must return an execution
729
+ * status as follows:
730
+ * - ES_FAILED: the advisor has detected failure
731
+ * - ES_FIX: the advisor's propagator (that is, this propagator)
732
+ * does not need to be run
733
+ * - ES_NOFIX: the advisor's propagator (that is, this propagator)
734
+ * must be run
735
+ *
736
+ * Apart from the above values, an advisor can return
737
+ * the result from calling the function
738
+ * - ES_SUBSUMED_FIX: the advisor is subsumed, the advisor's
739
+ * propagator does not need to be run
740
+ * - ES_SUBSUMED_NOFIX: the advisor is subsumed, the advisor's
741
+ * propagator must be run
742
+ * For more details, see the function documentation.
743
+ *
744
+ * The delta \a d describes how the variable has been changed
745
+ * by an operation on the advisor's variable. Typically,
746
+ * the delta information can only be utilized by either
747
+ * static or member functions of views as the actual delta
748
+ * information is both domain and view dependent.
749
+ *
750
+ */
751
+ GECODE_KERNEL_EXPORT
752
+ virtual ExecStatus advise(Space* home, Advisor* a, const Delta* d);
753
+ //@}
754
+ };
755
+
756
+
757
+ /**
758
+ * \brief Council of advisors
759
+ *
760
+ * If a propagator uses advisors, it must maintain its advisors
761
+ * through a council.
762
+ * \ingroup TaskActor
763
+ */
764
+ template <class A>
765
+ class Council {
766
+ friend class Advisor;
767
+ friend class Advisors<A>;
768
+ private:
769
+ /// Starting point for a linked list of advisors
770
+ mutable ActorLink* advisors;
771
+ public:
772
+ /// Default constructor
773
+ Council(void);
774
+ /// Construct advisor council
775
+ Council(Space* home);
776
+ /// Test whether council has advisor left
777
+ bool empty(void) const;
778
+ /// Update during cloning (copies all advisors)
779
+ void update(Space* home, bool share, Council<A>& c);
780
+ /// Dispose council
781
+ void dispose(Space* home);
782
+ };
783
+
784
+
785
+ /**
786
+ * \brief Class to iterate over advisors of a council
787
+ * \ingroup TaskActor
788
+ */
789
+ template <class A>
790
+ class Advisors {
791
+ private:
792
+ /// The current advisor
793
+ ActorLink* a;
794
+ public:
795
+ /// Initialize
796
+ Advisors(const Council<A>& c);
797
+ /// Test whether there advisors left
798
+ bool operator()(void) const;
799
+ /// Move iterator to next advisor
800
+ void operator++(void);
801
+ /// Return advisor
802
+ A* advisor(void) const;
803
+ };
804
+
805
+
806
+ /**
807
+ * \brief %Advisor \a a is subsumed
808
+ *
809
+ * Disposes the advisor and:
810
+ * - returns subsumption.
811
+ * - returns that the propagator of \a a need not be run.
812
+ *
813
+ * \warning Has a side-effect on the advisor. Use only directly when
814
+ * returning from advise.
815
+ * \ingroup TaskActorStatus
816
+ */
817
+ template <class A>
818
+ ExecStatus ES_SUBSUMED_FIX(A* a, Space* home, Council<A>& c);
819
+ /**
820
+ * \brief %Advisor \a a is subsumed
821
+ *
822
+ * Disposes the advisor and:
823
+ * - returns subsumption.
824
+ * - returns that the propagator of \a a must be run.
825
+ *
826
+ * \warning Has a side-effect on the advisor. Use only directly when
827
+ * returning from advise.
828
+ * \ingroup TaskActorStatus
829
+ */
830
+ template <class A>
831
+ ExecStatus ES_SUBSUMED_NOFIX(A* a, Space* home, Council<A>& c);
832
+
833
+ /**
834
+ * \brief Base-class for advisors
835
+ *
836
+ * Advisors are typically subclassed for each propagator that
837
+ * wants to use advisors. The actual member function that
838
+ * is executed when a variable is changed, must be implemented
839
+ * by the advisor's propagator.
840
+ *
841
+ * \ingroup TaskActor
842
+ */
843
+ class Advisor : private ActorLink {
844
+ template <class VIC> friend class VarImp;
845
+ template <class A> friend class Council;
846
+ template <class A> friend class Advisors;
847
+ private:
848
+ /// Is the advisor disposed?
849
+ bool disposed(void) const;
850
+ /// Static cast
851
+ static Advisor* cast(ActorLink* al);
852
+ /// Static cast
853
+ static const Advisor* cast(const ActorLink* al);
854
+ protected:
855
+ /// Return the advisor's propagator
856
+ Propagator* propagator(void) const;
857
+ public:
858
+ /// Constructor for creation
859
+ template <class A>
860
+ Advisor(Space* home, Propagator* p, Council<A>& c);
861
+ /// Copying constructor
862
+ Advisor(Space* home, bool share, Advisor& a);
863
+
864
+ /// \name Memory management
865
+ //@{
866
+ /// Dispose the advisor
867
+ template <class A>
868
+ void dispose(Space* home, Council<A>& c);
869
+ /// Allocate memory from space
870
+ static void* operator new(size_t s, Space* home);
871
+ /// No-op for exceptions
872
+ static void operator delete(void* p, Space* home);
873
+ //@}
874
+ private:
875
+ #ifndef __GNUC__
876
+ /// Not used (uses dispose instead)
877
+ static void operator delete(void* p);
878
+ #endif
879
+ /// Not used
880
+ static void* operator new(size_t s);
881
+ };
882
+
883
+
884
+ class Branching;
885
+
886
+ /**
887
+ * \brief Branch description for batch recomputation
888
+ *
889
+ * Must be refined by inheritance such that the information stored
890
+ * inside a branching description is sufficient to redo a tell
891
+ * performed by a particular branching.
892
+ *
893
+ * \ingroup TaskActor
894
+ */
895
+ class BranchingDesc {
896
+ friend class Space;
897
+ friend class Reflection::BranchingSpec;
898
+ private:
899
+ unsigned int _id; ///< Identity to match creating branching
900
+ unsigned int _alt; ///< Number of alternatives
901
+
902
+ /// Return id of the creating branching
903
+ unsigned int id(void) const;
904
+ protected:
905
+ /// Initialize for particular branching \a b and alternatives \a a
906
+ BranchingDesc(const Branching* b, const unsigned int a);
907
+ public:
908
+ /// Return number of alternatives
909
+ unsigned int alternatives(void) const;
910
+ /// Destructor
911
+ GECODE_KERNEL_EXPORT virtual ~BranchingDesc(void);
912
+ /// Report size occupied by branching description
913
+ virtual size_t size(void) const = 0;
914
+ /// Allocate memory from heap
915
+ static void* operator new(size_t);
916
+ /// Return memory to heap
917
+ static void operator delete(void*);
918
+ };
919
+
920
+ /**
921
+ * \brief Base-class for branchings
922
+ *
923
+ * Note that branchings cannot be created inside a propagator
924
+ * (no idea why one would like to do that anyway). If you do that
925
+ * the system will explode in a truly interesting way.
926
+ *
927
+ * \ingroup TaskActor
928
+ */
929
+ class GECODE_VTABLE_EXPORT Branching : public Actor {
930
+ friend class ActorLink;
931
+ friend class Space;
932
+ friend class BranchingDesc;
933
+ friend class Reflection::ActorSpecIter;
934
+ private:
935
+ /// Unique identity (to match to branching descriptions)
936
+ unsigned int id;
937
+ /// Static cast for a non-null pointer (to give a hint to optimizer)
938
+ static Branching* cast(ActorLink* al);
939
+ /// Static cast for a non-null pointer (to give a hint to optimizer)
940
+ static const Branching* cast(const ActorLink* al);
941
+ protected:
942
+ /// Constructor for creation
943
+ Branching(Space* home);
944
+ /// Constructor for cloning \a b
945
+ Branching(Space* home, bool share, Branching& b);
946
+
947
+ public:
948
+ /// \name Branching
949
+ //@{
950
+ /**
951
+ * \brief Check status of branching, return true if alternatives left
952
+ *
953
+ * This method is called when Space::status is called, it determines
954
+ * whether to continue branching with this branching or move on to
955
+ * the (possibly) next branching.
956
+ *
957
+ */
958
+ virtual bool status(const Space* home) const = 0;
959
+ /**
960
+ * \brief Return branching description
961
+ *
962
+ * Note that this method can rely on the fact that it is called
963
+ * immediately after a previous call to status. Hence, it is safe
964
+ * to remember computation from status in order to speed up
965
+ * description.
966
+ *
967
+ */
968
+ virtual const BranchingDesc* description(const Space* home) const = 0;
969
+ /**
970
+ * \brief Commit for branching description \a d and alternative \a a
971
+ *
972
+ * The current branching in the space \a home performs a commit from
973
+ * the information provided by the branching description \a d
974
+ * and the alternative \a a.
975
+ */
976
+ virtual ExecStatus commit(Space* home, const BranchingDesc* d,
977
+ unsigned int a) = 0;
978
+ //@}
979
+
980
+ /// \name Reflection
981
+ //@{
982
+ /// Specification for BranchingDesc \a d
983
+ virtual GECODE_KERNEL_EXPORT Reflection::BranchingSpec
984
+ branchingSpec(const Space* home,
985
+ Reflection::VarMap& m, const BranchingDesc* d) const;
986
+ //@}
987
+ };
988
+
989
+
990
+
991
+ /**
992
+ * \brief %Space status
993
+ * \ingroup TaskSearch
994
+ */
995
+ enum SpaceStatus {
996
+ SS_FAILED, ///< %Space is failed
997
+ SS_SOLVED, ///< %Space is solved (no branching left)
998
+ SS_BRANCH ///< %Space must be branched (at least one branching left)
999
+ };
1000
+
1001
+ /**
1002
+ * \brief Computation spaces
1003
+ */
1004
+ class GECODE_VTABLE_EXPORT Space {
1005
+ friend class Actor;
1006
+ friend class Propagator;
1007
+ friend class Branching;
1008
+ friend class Advisor;
1009
+ friend class Reflection::ActorSpecIter;
1010
+ template <class VIC> friend class VarImp;
1011
+ template <class VarType> friend class VarDisposer;
1012
+ friend class SharedHandle;
1013
+ private:
1014
+ /// Performs memory management for space
1015
+ MemoryManager mm;
1016
+ /**
1017
+ * \brief Doubly linked list of all actors
1018
+ *
1019
+ * Propagators are stored at the beginning, branchings (if any) at
1020
+ * the end.
1021
+ */
1022
+ ActorLink a_actors;
1023
+ /**
1024
+ * \brief Points to the first branching to be used for status
1025
+ *
1026
+ * If equal to &a_actors, no branching does exist.
1027
+ */
1028
+ Branching* b_status;
1029
+ /**
1030
+ * \brief Points to the first branching to be used for commit
1031
+ *
1032
+ * Note that \a b_commit can point to an earlier branching
1033
+ * than \a b_status. This reflects the fact that the earlier
1034
+ * branching is already done (that is, status on that branching
1035
+ * returns false) but there might be still branching descriptions
1036
+ * referring to the earlier branching.
1037
+ *
1038
+ * If equal to &a_actors, no branching does exist.
1039
+ */
1040
+ Branching* b_commit;
1041
+ union {
1042
+ /// Data only available during propagation
1043
+ struct {
1044
+ /**
1045
+ * \brief Cost level with next propagator to be executed
1046
+ *
1047
+ * This maintains the following invariant (but only if the
1048
+ * space does not perform propagation):
1049
+ * - If active points to a queue, this queue might contain
1050
+ * a propagator. However, there will be at least one queue
1051
+ * containing a propagator.
1052
+ * - Otherwise, active is smaller than the beginning of
1053
+ * the queues. Then, the space is stable.
1054
+ * - If active is NULL, the space is failed.
1055
+ */
1056
+ ActorLink* active;
1057
+ /// Scheduled propagators according to cost
1058
+ ActorLink queue[PC_MAX+1];
1059
+ /// Id of next branching to be created
1060
+ unsigned int branch_id;
1061
+ /// Number of subscriptions
1062
+ unsigned int n_sub;
1063
+ } p;
1064
+ /// Data available only during copying
1065
+ struct {
1066
+ /// Entries for updating variables
1067
+ VarImpBase* vars_u[AllVarConf::idx_c];
1068
+ /// Keep variables during copying without index structure
1069
+ VarImpBase* vars_noidx;
1070
+ /// Linked list of shared objects
1071
+ SharedHandle::Object* shared;
1072
+ } c;
1073
+ } pc;
1074
+ /// Put propagator \a p into right queue
1075
+ void enqueue(Propagator* p);
1076
+ /**
1077
+ * \name update, and dispose variables
1078
+ */
1079
+ //@{
1080
+ #ifdef GECODE_HAS_VAR_DISPOSE
1081
+ /// Registered variable type disposers
1082
+ GECODE_KERNEL_EXPORT static VarDisposerBase* vd[AllVarConf::idx_d];
1083
+ /// Entries for disposing variables
1084
+ VarImpBase* _vars_d[AllVarConf::idx_d];
1085
+ /// Return reference to variables (dispose)
1086
+ template <class VIC> VarImpBase* vars_d(void) const;
1087
+ /// Set reference to variables (dispose)
1088
+ template <class VIC> void vars_d(VarImpBase* x);
1089
+ #endif
1090
+ /// Update all cloned variables
1091
+ void update(ActorLink** sub);
1092
+ //@}
1093
+
1094
+ /// First actor for forced disposal
1095
+ Actor** d_fst;
1096
+ /// Current actor for forced disposal
1097
+ Actor** d_cur;
1098
+ /// Last actor for forced disposal
1099
+ Actor** d_lst;
1100
+ /// Resize disposal array
1101
+ GECODE_KERNEL_EXPORT void d_resize(void);
1102
+
1103
+ /// Used for default arguments
1104
+ GECODE_KERNEL_EXPORT static unsigned long int unused_uli;
1105
+ public:
1106
+ /**
1107
+ * \brief Default constructor
1108
+ * \ingroup TaskModelScript
1109
+ */
1110
+ GECODE_KERNEL_EXPORT Space(void);
1111
+ /**
1112
+ * \brief Destructor
1113
+ * \ingroup TaskModelScript
1114
+ */
1115
+ GECODE_KERNEL_EXPORT virtual ~Space(void);
1116
+ /**
1117
+ * \brief Constructor for cloning
1118
+ *
1119
+ * Must copy and update all data structures (such as variables
1120
+ * and variable arrays) required by the subclass of Space.
1121
+ *
1122
+ * If \a share is true, share all data structures among copies.
1123
+ * Otherwise, make independent copies.
1124
+ * \ingroup TaskModelScript
1125
+ */
1126
+ GECODE_KERNEL_EXPORT Space(bool share, Space& s);
1127
+ /**
1128
+ * \brief Copying member function
1129
+ *
1130
+ * Must create a new object using the constructor for cloning.
1131
+ * \ingroup TaskModelScript
1132
+ */
1133
+ virtual Space* copy(bool share) = 0;
1134
+ /**
1135
+ * \brief Allocate memory from heap for new space
1136
+ * \ingroup TaskModelScript
1137
+ */
1138
+ static void* operator new(size_t);
1139
+ /**
1140
+ * \brief Free memory allocated from heap
1141
+ * \ingroup TaskModelScript
1142
+ */
1143
+ static void operator delete(void*);
1144
+
1145
+
1146
+ /*
1147
+ * Member functions for search engines
1148
+ *
1149
+ */
1150
+
1151
+ /**
1152
+ * \brief Query space status
1153
+ *
1154
+ * Propagates the space until fixpoint or failure and
1155
+ * increments \a pn by the number of propagator executions.
1156
+ * - if the space is failed, SpaceStatus::SS_FAILED is returned.
1157
+ * - if the space is not failed but the space has no branching left,
1158
+ * SpaceStatus::SS_SOLVED is returned.
1159
+ * - otherwise, SpaceStatus::SS_BRANCH is returned.
1160
+ * \ingroup TaskSearch
1161
+ */
1162
+ GECODE_KERNEL_EXPORT SpaceStatus status(unsigned long int& pn=unused_uli);
1163
+
1164
+ /**
1165
+ * \brief Create new branching description for current branching
1166
+ *
1167
+ * This member function can only be called after the member function
1168
+ * Space::status on the same space has been called and in between
1169
+ * no non-const member function has been called on this space.
1170
+ *
1171
+ * Note that the above invariant only pertains to calls of member
1172
+ * functions of the same space. If the invariant is violated, the
1173
+ * system is likely to crash (hopefully it does). In particular, if
1174
+ * applied to a space with no current branching, the system will
1175
+ * crash.
1176
+ *
1177
+ * \ingroup TaskSearch
1178
+ */
1179
+ const BranchingDesc* description(void) const;
1180
+
1181
+ /**
1182
+ * \brief Clone space
1183
+ *
1184
+ * Assumes that the space is stable and not failed. If the space is
1185
+ * failed, an exception of type SpaceFailed is thrown. If the space
1186
+ * is not stable, an exception of SpaceNotStable is thrown.
1187
+ *
1188
+ * Otherwise, a clone of the space is returned. If \a share is true,
1189
+ * sharable datastructures are shared among the clone and the original
1190
+ * space. If \a share is false, independent copies of the shared
1191
+ * datastructures must be created. This means that a clone with no
1192
+ * sharing can be used in a different thread without any interaction
1193
+ * with the original space.
1194
+ *
1195
+ * \ingroup TaskSearch
1196
+ */
1197
+ GECODE_KERNEL_EXPORT Space* clone(bool share=true);
1198
+
1199
+ /**
1200
+ * \brief Commit branching description \a d and for alternative \a a
1201
+ *
1202
+ * The current branching in the space performs a commit from
1203
+ * the information provided by the branching description \a d
1204
+ * and the alternative \a a.
1205
+ *
1206
+ * Note that no propagation is perfomed (to support batch
1207
+ * recomputation), in order to perform propagation the member
1208
+ * function status must be used.
1209
+ *
1210
+ * Committing with branching descriptions must be carried
1211
+ * out in the same order as the branch descriptions have been
1212
+ * obtained by the member function Space::description().
1213
+ *
1214
+ * It is perfectly okay to add constraints interleaved with
1215
+ * branching descriptions (provided they are in the right order).
1216
+ * However, if propagation is performed by calling the member
1217
+ * function status and then new branching descriptions are
1218
+ * computed, these branching descriptions are different.
1219
+ *
1220
+ * Committing throws the following exceptions:
1221
+ * - SpaceNoBranching, if the space has no current branching (it is
1222
+ * already solved).
1223
+ * - SpaceIllegalAlternative, if \a a is not smaller than the number
1224
+ * of alternatives supported by the branching description \a d.
1225
+ *
1226
+ * \ingroup TaskSearch
1227
+ */
1228
+ GECODE_KERNEL_EXPORT void commit(const BranchingDesc* d, unsigned int a);
1229
+
1230
+ /**
1231
+ * \brief Fail space
1232
+ *
1233
+ * This is useful for failing outside of actors. Never use inside
1234
+ * a propagate or commit member function. The system will crash!
1235
+ * \ingroup TaskActor
1236
+ */
1237
+ void fail(void);
1238
+ /**
1239
+ * \brief Check whether space is failed
1240
+ *
1241
+ * Note that this does not perform propagation. This is useful
1242
+ * for posting actors: only if a space is not yet failed, new
1243
+ * actors are allowed to be created.
1244
+ * \ingroup TaskActor
1245
+ */
1246
+ bool failed(void) const;
1247
+ /**
1248
+ * \brief Return if space is stable (at fixpoint or failed)
1249
+ * \ingroup TaskActor
1250
+ */
1251
+ bool stable(void) const;
1252
+ /**
1253
+ * \brief Return number of propagators
1254
+ *
1255
+ * Note that this function takes linear time in the number of
1256
+ * propagators.
1257
+ */
1258
+ GECODE_KERNEL_EXPORT unsigned int propagators(void) const;
1259
+ /**
1260
+ * \brief Return number of branchings
1261
+ *
1262
+ * Note that this function takes linear time in the number of
1263
+ * branchings.
1264
+ */
1265
+ GECODE_KERNEL_EXPORT unsigned int branchings(void) const;
1266
+
1267
+ /**
1268
+ * \name Reflection
1269
+ */
1270
+ //@{
1271
+ /// Enter variables into \a m
1272
+ GECODE_KERNEL_EXPORT
1273
+ virtual void getVars(Reflection::VarMap& m, bool registerOnly);
1274
+ /// Get reflection for BranchingDesc \a d
1275
+ GECODE_KERNEL_EXPORT
1276
+ Reflection::BranchingSpec branchingSpec(Reflection::VarMap& m,
1277
+ const BranchingDesc* d) const;
1278
+ //@}
1279
+
1280
+ /**
1281
+ * \defgroup FuncMemSpace Space-memory management
1282
+ * \ingroup FuncMem
1283
+ */
1284
+ //@{
1285
+ /// Allocate memory on space heap
1286
+ void* alloc(size_t);
1287
+ /// Attempt to reuse memory previously allocated with alloc
1288
+ void reuse(void*,size_t);
1289
+ /// Allocate from freelist-managed memory
1290
+ template <size_t> void* fl_alloc(void);
1291
+ /**
1292
+ * \brief Return freelist-managed memory to freelist
1293
+ *
1294
+ * The first list element to be retuned is \a f, the last is \a l.
1295
+ */
1296
+ template <size_t> void fl_dispose(FreeList* f, FreeList* l);
1297
+ /**
1298
+ * \brief Return how much heap memory is allocated
1299
+ *
1300
+ * Note that is includes both the memory allocated for the space heap
1301
+ * as well as additional memory allocated by actors.
1302
+ */
1303
+ GECODE_KERNEL_EXPORT
1304
+ size_t allocated(void) const;
1305
+ //@}
1306
+ };
1307
+
1308
+
1309
+
1310
+
1311
+ /*
1312
+ * Memory management
1313
+ *
1314
+ */
1315
+
1316
+ // Heap allocated
1317
+ forceinline void*
1318
+ SharedHandle::Object::operator new(size_t s) {
1319
+ return Memory::malloc(s);
1320
+ }
1321
+ forceinline void
1322
+ SharedHandle::Object::operator delete(void* p) {
1323
+ Memory::free(p);
1324
+ }
1325
+
1326
+ forceinline void*
1327
+ Space::operator new(size_t s) {
1328
+ return Memory::malloc(s);
1329
+ }
1330
+ forceinline void
1331
+ Space::operator delete(void* p) {
1332
+ Memory::free(p);
1333
+ }
1334
+
1335
+ forceinline void
1336
+ BranchingDesc::operator delete(void* p) {
1337
+ Memory::free(p);
1338
+ }
1339
+ forceinline void*
1340
+ BranchingDesc::operator new(size_t s) {
1341
+ return Memory::malloc(s);
1342
+ }
1343
+
1344
+ // Space allocation: general space heaps and free lists
1345
+ forceinline void*
1346
+ Space::alloc(size_t s) {
1347
+ return mm.alloc(s);
1348
+ }
1349
+ forceinline void
1350
+ Space::reuse(void* p, size_t s) {
1351
+ return mm.reuse(p,s);
1352
+ }
1353
+ template <size_t s>
1354
+ forceinline void*
1355
+ Space::fl_alloc(void) {
1356
+ return mm.template fl_alloc<s>();
1357
+ }
1358
+ template <size_t s>
1359
+ forceinline void
1360
+ Space::fl_dispose(FreeList* f, FreeList* l) {
1361
+ mm.template fl_dispose<s>(f,l);
1362
+ }
1363
+
1364
+ #ifdef GECODE_HAS_VAR_DISPOSE
1365
+ template <class VIC>
1366
+ forceinline VarImpBase*
1367
+ Space::vars_d(void) const {
1368
+ return _vars_d[VIC::idx_d];
1369
+ }
1370
+ template <class VIC>
1371
+ forceinline void
1372
+ Space::vars_d(VarImpBase* x) {
1373
+ _vars_d[VIC::idx_d] = x;
1374
+ }
1375
+ #endif
1376
+
1377
+ // Space allocated entities: Actors, variable implementations, and advisors
1378
+ forceinline void
1379
+ Actor::operator delete(void*) {}
1380
+ forceinline void
1381
+ Actor::operator delete(void*, Space*) {}
1382
+ forceinline void*
1383
+ Actor::operator new(size_t s, Space* home) {
1384
+ return home->alloc(s);
1385
+ }
1386
+
1387
+ template <class VIC>
1388
+ forceinline void
1389
+ VarImp<VIC>::operator delete(void*) {}
1390
+ template <class VIC>
1391
+ forceinline void
1392
+ VarImp<VIC>::operator delete(void*, Space*) {}
1393
+ template <class VIC>
1394
+ forceinline void*
1395
+ VarImp<VIC>::operator new(size_t s, Space* home) {
1396
+ return home->alloc(s);
1397
+ }
1398
+
1399
+ #ifndef __GNUC__
1400
+ forceinline void
1401
+ Advisor::operator delete(void*) {}
1402
+ #endif
1403
+ forceinline void
1404
+ Advisor::operator delete(void*, Space*) {}
1405
+ forceinline void*
1406
+ Advisor::operator new(size_t s, Space* home) {
1407
+ return home->alloc(s);
1408
+ }
1409
+
1410
+
1411
+ /*
1412
+ * Shared objects and handles
1413
+ *
1414
+ */
1415
+ forceinline
1416
+ SharedHandle::Object::Object(void)
1417
+ : use_cnt(0), fwd(NULL) {}
1418
+ forceinline
1419
+ SharedHandle::Object::~Object(void) {
1420
+ assert(use_cnt == 0);
1421
+ }
1422
+
1423
+ forceinline void
1424
+ SharedHandle::subscribe(void) {
1425
+ if (o != NULL) o->use_cnt++;
1426
+ }
1427
+ forceinline void
1428
+ SharedHandle::cancel(void) {
1429
+ if ((o != NULL) && (--o->use_cnt == 0))
1430
+ delete o;
1431
+ o = NULL;
1432
+ }
1433
+ forceinline
1434
+ SharedHandle::SharedHandle(void) : o(NULL) {}
1435
+ forceinline
1436
+ SharedHandle::SharedHandle(SharedHandle::Object* so) : o(so) {
1437
+ subscribe();
1438
+ }
1439
+ forceinline
1440
+ SharedHandle::SharedHandle(const SharedHandle& sh) : o(sh.o) {
1441
+ subscribe();
1442
+ }
1443
+ forceinline SharedHandle&
1444
+ SharedHandle::operator=(const SharedHandle& sh) {
1445
+ if (&sh != this) {
1446
+ cancel(); o = sh.o; subscribe();
1447
+ }
1448
+ return *this;
1449
+ }
1450
+ forceinline void
1451
+ SharedHandle::update(Space* home, bool share, SharedHandle& sh) {
1452
+ if (sh.o == NULL) {
1453
+ o = NULL;
1454
+ } else if (share) {
1455
+ o = sh.o; subscribe();
1456
+ } else if (sh.o->fwd != NULL) {
1457
+ o = sh.o->fwd; subscribe();
1458
+ } else {
1459
+ o = sh.o->copy();
1460
+ sh.o->fwd = o;
1461
+ sh.o->next = home->pc.c.shared;
1462
+ home->pc.c.shared = sh.o;
1463
+ subscribe();
1464
+ }
1465
+ }
1466
+ forceinline
1467
+ SharedHandle::~SharedHandle(void) {
1468
+ cancel();
1469
+ }
1470
+ forceinline SharedHandle::Object*
1471
+ SharedHandle::object(void) const {
1472
+ return o;
1473
+ }
1474
+ forceinline void
1475
+ SharedHandle::object(SharedHandle::Object* n) {
1476
+ if (n != o) {
1477
+ cancel(); o=n; subscribe();
1478
+ }
1479
+ }
1480
+
1481
+
1482
+
1483
+ /*
1484
+ * ActorLink
1485
+ *
1486
+ */
1487
+ forceinline ActorLink*
1488
+ ActorLink::prev(void) const {
1489
+ return _prev;
1490
+ }
1491
+
1492
+ forceinline ActorLink*
1493
+ ActorLink::next(void) const {
1494
+ return _next;
1495
+ }
1496
+
1497
+ forceinline ActorLink**
1498
+ ActorLink::next_ref(void) {
1499
+ return &_next;
1500
+ }
1501
+
1502
+ forceinline void
1503
+ ActorLink::prev(ActorLink* al) {
1504
+ _prev = al;
1505
+ }
1506
+
1507
+ forceinline void
1508
+ ActorLink::next(ActorLink* al) {
1509
+ _next = al;
1510
+ }
1511
+
1512
+ forceinline void
1513
+ ActorLink::unlink(void) {
1514
+ ActorLink* p = _prev; ActorLink* n = _next;
1515
+ p->_next = n; n->_prev = p;
1516
+ }
1517
+
1518
+ forceinline void
1519
+ ActorLink::init(void) {
1520
+ _next = this; _prev =this;
1521
+ }
1522
+
1523
+ forceinline void
1524
+ ActorLink::head(ActorLink* a) {
1525
+ // Inserts al at head of link-chain (that is, after this)
1526
+ ActorLink* n = _next;
1527
+ this->_next = a; a->_prev = this;
1528
+ a->_next = n; n->_prev = a;
1529
+ }
1530
+
1531
+ forceinline void
1532
+ ActorLink::tail(ActorLink* a) {
1533
+ // Inserts al at tail of link-chain (that is, before this)
1534
+ ActorLink* p = _prev;
1535
+ a->_next = this; this->_prev = a;
1536
+ p->_next = a; a->_prev = p;
1537
+ }
1538
+
1539
+ template <class T>
1540
+ forceinline ActorLink*
1541
+ ActorLink::cast(T* a) {
1542
+ // Turning al into a reference is for gcc, assume is for MSVC
1543
+ GECODE_NOT_NULL(a);
1544
+ ActorLink& t = *a;
1545
+ return static_cast<ActorLink*>(&t);
1546
+ }
1547
+
1548
+ template <class T>
1549
+ forceinline const ActorLink*
1550
+ ActorLink::cast(const T* a) {
1551
+ // Turning al into a reference is for gcc, assume is for MSVC
1552
+ GECODE_NOT_NULL(a);
1553
+ const ActorLink& t = *a;
1554
+ return static_cast<const ActorLink*>(&t);
1555
+ }
1556
+
1557
+
1558
+ /*
1559
+ * Actor
1560
+ *
1561
+ */
1562
+ forceinline Actor*
1563
+ Actor::cast(ActorLink* al) {
1564
+ // Turning al into a reference is for gcc, assume is for MSVC
1565
+ GECODE_NOT_NULL(al);
1566
+ ActorLink& t = *al;
1567
+ return static_cast<Actor*>(&t);
1568
+ }
1569
+
1570
+ forceinline const Actor*
1571
+ Actor::cast(const ActorLink* al) {
1572
+ // Turning al into a reference is for gcc, assume is for MSVC
1573
+ GECODE_NOT_NULL(al);
1574
+ const ActorLink& t = *al;
1575
+ return static_cast<const Actor*>(&t);
1576
+ }
1577
+
1578
+ forceinline void
1579
+ Actor::force(Space* home) {
1580
+ if (home->d_cur == home->d_lst)
1581
+ home->d_resize();
1582
+ *(home->d_cur++) = this;
1583
+ }
1584
+
1585
+ forceinline void
1586
+ Actor::unforce(Space* home) {
1587
+ // Check wether array has already been discarded as space
1588
+ // deletion is already in progress
1589
+ Actor** f = home->d_fst;
1590
+ if (f != NULL) {
1591
+ while (this != *f)
1592
+ f++;
1593
+ *f = *(--home->d_cur);
1594
+ }
1595
+ }
1596
+
1597
+ forceinline size_t
1598
+ Actor::dispose(Space*) {
1599
+ return sizeof(*this);
1600
+ }
1601
+
1602
+
1603
+ /*
1604
+ * Propagator
1605
+ *
1606
+ */
1607
+ forceinline Propagator*
1608
+ Propagator::cast(ActorLink* al) {
1609
+ // Turning al into a reference is for gcc, assume is for MSVC
1610
+ GECODE_NOT_NULL(al);
1611
+ ActorLink& t = *al;
1612
+ return static_cast<Propagator*>(&t);
1613
+ }
1614
+
1615
+ forceinline const Propagator*
1616
+ Propagator::cast(const ActorLink* al) {
1617
+ // Turning al into a reference is for gcc, assume is for MSVC
1618
+ GECODE_NOT_NULL(al);
1619
+ const ActorLink& t = *al;
1620
+ return static_cast<const Propagator*>(&t);
1621
+ }
1622
+
1623
+ forceinline
1624
+ Propagator::Propagator(Space* home) {
1625
+ u.advisors = NULL;
1626
+ assert(u.med == 0 && u.size == 0);
1627
+ home->a_actors.head(this);
1628
+ }
1629
+
1630
+ forceinline
1631
+ Propagator::Propagator(Space*, bool, Propagator& p) {
1632
+ u.advisors = NULL;
1633
+ assert(u.med == 0 && u.size == 0);
1634
+ // Set forwarding pointer
1635
+ p.prev(this);
1636
+ }
1637
+
1638
+ forceinline ExecStatus
1639
+ ES_SUBSUMED(Propagator* p, size_t s) {
1640
+ p->u.size = s;
1641
+ return __ES_SUBSUMED;
1642
+ }
1643
+
1644
+ forceinline ExecStatus
1645
+ ES_SUBSUMED(Propagator* p, Space* home) {
1646
+ p->u.size = p->dispose(home);
1647
+ return __ES_SUBSUMED;
1648
+ }
1649
+
1650
+ forceinline ExecStatus
1651
+ ES_FIX_PARTIAL(Propagator* p, ModEventDelta med) {
1652
+ p->u.med = med;
1653
+ assert(p->u.med != 0);
1654
+ return __ES_PARTIAL;
1655
+ }
1656
+
1657
+ forceinline ExecStatus
1658
+ ES_NOFIX_PARTIAL(Propagator* p, ModEventDelta med) {
1659
+ p->u.med = AllVarConf::med_combine(p->u.med,med);
1660
+ assert(p->u.med != 0);
1661
+ return __ES_PARTIAL;
1662
+ }
1663
+
1664
+
1665
+
1666
+ /*
1667
+ * Branching
1668
+ *
1669
+ */
1670
+ forceinline Branching*
1671
+ Branching::cast(ActorLink* al) {
1672
+ // Turning al into a reference is for gcc, assume is for MSVC
1673
+ GECODE_NOT_NULL(al);
1674
+ ActorLink& t = *al;
1675
+ return static_cast<Branching*>(&t);
1676
+ }
1677
+
1678
+ forceinline const Branching*
1679
+ Branching::cast(const ActorLink* al) {
1680
+ // Turning al into a reference is for gcc, assume is for MSVC
1681
+ GECODE_NOT_NULL(al);
1682
+ const ActorLink& t = *al;
1683
+ return static_cast<const Branching*>(&t);
1684
+ }
1685
+
1686
+ forceinline
1687
+ Branching::Branching(Space* home) {
1688
+ // Propagators are put at the tail of the link of actors
1689
+ id = home->pc.p.branch_id++;
1690
+ // If no branching available, make it the first one
1691
+ if (home->b_status == &(home->a_actors)) {
1692
+ home->b_status = this;
1693
+ if (home->b_commit == &(home->a_actors))
1694
+ home->b_commit = this;
1695
+ }
1696
+ home->a_actors.tail(this);
1697
+ }
1698
+
1699
+ forceinline
1700
+ Branching::Branching(Space*, bool, Branching& b)
1701
+ : id(b.id) {
1702
+ // Set forwarding pointer
1703
+ b.prev(this);
1704
+ }
1705
+
1706
+
1707
+
1708
+ /*
1709
+ * Branching description
1710
+ *
1711
+ */
1712
+ forceinline
1713
+ BranchingDesc::BranchingDesc(const Branching* b, const unsigned int a)
1714
+ : _id(b->id), _alt(a) {}
1715
+
1716
+ forceinline unsigned int
1717
+ BranchingDesc::alternatives(void) const {
1718
+ return _alt;
1719
+ }
1720
+
1721
+ forceinline unsigned int
1722
+ BranchingDesc::id(void) const {
1723
+ return _id;
1724
+ }
1725
+
1726
+ forceinline
1727
+ BranchingDesc::~BranchingDesc(void) {}
1728
+
1729
+
1730
+
1731
+ /*
1732
+ * Delta information for advisors
1733
+ *
1734
+ */
1735
+ forceinline ModEvent
1736
+ Delta::modevent(void) const {
1737
+ return me;
1738
+ }
1739
+
1740
+
1741
+
1742
+ /*
1743
+ * Advisor
1744
+ *
1745
+ */
1746
+ template <class A>
1747
+ forceinline
1748
+ Advisor::Advisor(Space*, Propagator* p, Council<A>& c) {
1749
+ assert(p != NULL);
1750
+ // Store propagator and forwarding in prev()
1751
+ ActorLink::prev(p);
1752
+ // Link to next advisor in next()
1753
+ ActorLink::next(c.advisors); c.advisors = static_cast<A*>(this);
1754
+ }
1755
+
1756
+ forceinline
1757
+ Advisor::Advisor(Space*, bool, Advisor&) {}
1758
+
1759
+ forceinline bool
1760
+ Advisor::disposed(void) const {
1761
+ return prev() == NULL;
1762
+ }
1763
+
1764
+ forceinline Advisor*
1765
+ Advisor::cast(ActorLink* al) {
1766
+ return static_cast<Advisor*>(al);
1767
+ }
1768
+
1769
+ forceinline const Advisor*
1770
+ Advisor::cast(const ActorLink* al) {
1771
+ return static_cast<const Advisor*>(al);
1772
+ }
1773
+
1774
+ forceinline Propagator*
1775
+ Advisor::propagator(void) const {
1776
+ assert(!disposed());
1777
+ return Propagator::cast(ActorLink::prev());
1778
+ }
1779
+
1780
+ template <class A>
1781
+ forceinline void
1782
+ Advisor::dispose(Space*,Council<A>&) {
1783
+ assert(!disposed());
1784
+ ActorLink::prev(NULL);
1785
+ // Shorten chains of disposed advisors by one, if possible
1786
+ Advisor* n = Advisor::cast(next());
1787
+ if ((n != NULL) && n->disposed())
1788
+ next(n->next());
1789
+ }
1790
+
1791
+ template <class A>
1792
+ forceinline ExecStatus
1793
+ ES_SUBSUMED_FIX(A* a, Space* home, Council<A>& c) {
1794
+ a->dispose(home,c);
1795
+ return ES_FIX;
1796
+ }
1797
+
1798
+ template <class A>
1799
+ forceinline ExecStatus
1800
+ ES_SUBSUMED_NOFIX(A* a, Space* home, Council<A>& c) {
1801
+ a->dispose(home,c);
1802
+ return ES_NOFIX;
1803
+ }
1804
+
1805
+
1806
+
1807
+ /*
1808
+ * Advisor council
1809
+ *
1810
+ */
1811
+ template <class A>
1812
+ forceinline
1813
+ Council<A>::Council(void) {}
1814
+
1815
+ template <class A>
1816
+ forceinline
1817
+ Council<A>::Council(Space*)
1818
+ : advisors(NULL) {}
1819
+
1820
+ template <class A>
1821
+ forceinline bool
1822
+ Council<A>::empty(void) const {
1823
+ ActorLink* a = advisors;
1824
+ while ((a != NULL) && static_cast<A*>(a)->disposed())
1825
+ a = a->next();
1826
+ advisors = a;
1827
+ return a == NULL;
1828
+ }
1829
+
1830
+ template <class A>
1831
+ forceinline void
1832
+ Council<A>::update(Space* home, bool share, Council<A>& c) {
1833
+ // Skip all disposed advisors
1834
+ {
1835
+ ActorLink* a = c.advisors;
1836
+ while ((a != NULL) && static_cast<A*>(a)->disposed())
1837
+ a = a->next();
1838
+ c.advisors = a;
1839
+ }
1840
+ // Are there any advisors to be cloned?
1841
+ if (c.advisors != NULL) {
1842
+ // The propagator in from-space
1843
+ Propagator* p_f = static_cast<A*>(c.advisors)->propagator();
1844
+ // The propagator in to-space
1845
+ Propagator* p_t = Propagator::cast(p_f->prev());
1846
+ // Advisors in from-space
1847
+ ActorLink** a_f = &c.advisors;
1848
+ // Advisors in to-space
1849
+ A* a_t = NULL;
1850
+ while (*a_f != NULL) {
1851
+ if (static_cast<A*>(*a_f)->disposed()) {
1852
+ *a_f = (*a_f)->next();
1853
+ } else {
1854
+ // Run specific copying part
1855
+ A* a = new (home) A(home,share,*static_cast<A*>(*a_f));
1856
+ // Set propagator pointer
1857
+ a->prev(p_t);
1858
+ // Set forwarding pointer
1859
+ (*a_f)->prev(a);
1860
+ // Link
1861
+ a->next(a_t);
1862
+ a_t = a;
1863
+ a_f = (*a_f)->next_ref();
1864
+ }
1865
+ }
1866
+ advisors = a_t;
1867
+ // Enter advisor link for reset
1868
+ assert(p_f->u.advisors == NULL);
1869
+ p_f->u.advisors = c.advisors;
1870
+ }
1871
+ }
1872
+
1873
+ template <class A>
1874
+ forceinline void
1875
+ Council<A>::dispose(Space* home) {
1876
+ ActorLink* a = advisors;
1877
+ while (a != NULL) {
1878
+ if (!static_cast<A*>(a)->disposed())
1879
+ static_cast<A*>(a)->dispose(home,*this);
1880
+ a = a->next();
1881
+ }
1882
+ }
1883
+
1884
+
1885
+
1886
+ /*
1887
+ * Advisor iterator
1888
+ *
1889
+ */
1890
+ template <class A>
1891
+ forceinline
1892
+ Advisors<A>::Advisors(const Council<A>& c)
1893
+ : a(c.advisors) {
1894
+ while ((a != NULL) && static_cast<A*>(a)->disposed())
1895
+ a = a->next();
1896
+ }
1897
+
1898
+ template <class A>
1899
+ forceinline bool
1900
+ Advisors<A>::operator()(void) const {
1901
+ return a != NULL;
1902
+ }
1903
+
1904
+ template <class A>
1905
+ forceinline void
1906
+ Advisors<A>::operator++(void) {
1907
+ do {
1908
+ a = a->next();
1909
+ } while ((a != NULL) && static_cast<A*>(a)->disposed());
1910
+ }
1911
+
1912
+ template <class A>
1913
+ forceinline A*
1914
+ Advisors<A>::advisor(void) const {
1915
+ return static_cast<A*>(a);
1916
+ }
1917
+
1918
+
1919
+
1920
+ /*
1921
+ * Space
1922
+ *
1923
+ */
1924
+ forceinline void
1925
+ Space::enqueue(Propagator* p) {
1926
+ ActorLink::cast(p)->unlink();
1927
+ ActorLink* c = &pc.p.queue[p->cost(p->u.med)];
1928
+ c->tail(ActorLink::cast(p));
1929
+ if (c > pc.p.active)
1930
+ pc.p.active = c;
1931
+ }
1932
+
1933
+ forceinline const BranchingDesc*
1934
+ Space::description(void) const {
1935
+ return b_status->description(this);
1936
+ }
1937
+
1938
+ forceinline void
1939
+ Space::fail(void) {
1940
+ pc.p.active = NULL;
1941
+ }
1942
+
1943
+ forceinline bool
1944
+ Space::failed(void) const {
1945
+ return pc.p.active == NULL;
1946
+ }
1947
+
1948
+ forceinline bool
1949
+ Space::stable(void) const {
1950
+ return pc.p.active < &pc.p.queue[0];
1951
+ }
1952
+
1953
+
1954
+
1955
+ /*
1956
+ * Variable implementation
1957
+ *
1958
+ */
1959
+ template <class VIC>
1960
+ forceinline
1961
+ VarImp<VIC>::VarImp(Space*) {
1962
+ for (PropCond i=0; i<pc_max+3; i++)
1963
+ idx[i] = NULL;
1964
+ free_and_bits = 0;
1965
+ }
1966
+
1967
+ template <class VIC>
1968
+ forceinline
1969
+ VarImp<VIC>::VarImp(void) {
1970
+ for (PropCond i=0; i<pc_max+3; i++)
1971
+ idx[i] = NULL;
1972
+ free_and_bits = 0;
1973
+ }
1974
+
1975
+ template <class VIC>
1976
+ forceinline unsigned int
1977
+ VarImp<VIC>::degree(void) const {
1978
+ assert(!copied());
1979
+ return static_cast<unsigned int>(idx[pc_max+2] - idx[0]);
1980
+ }
1981
+
1982
+ template <class VIC>
1983
+ forceinline unsigned int
1984
+ VarImp<VIC>::bits(void) const {
1985
+ return free_and_bits;
1986
+ }
1987
+
1988
+ template <class VIC>
1989
+ forceinline unsigned int&
1990
+ VarImp<VIC>::bits(void) {
1991
+ return free_and_bits;
1992
+ }
1993
+
1994
+ #ifdef GECODE_HAS_VAR_DISPOSE
1995
+ template <class VIC>
1996
+ forceinline VarImp<VIC>*
1997
+ VarImp<VIC>::vars_d(Space* home) {
1998
+ return static_cast<VarImp<VIC>*>(home->vars_d<VIC>());
1999
+ }
2000
+
2001
+ template <class VIC>
2002
+ forceinline void
2003
+ VarImp<VIC>::vars_d(Space* home, VarImp<VIC>* x) {
2004
+ home->vars_d<VIC>(x);
2005
+ }
2006
+ #endif
2007
+
2008
+ template <class VIC>
2009
+ forceinline bool
2010
+ VarImp<VIC>::copied(void) const {
2011
+ return Support::marked(idx[0]);
2012
+ }
2013
+
2014
+ template <class VIC>
2015
+ forceinline VarImp<VIC>*
2016
+ VarImp<VIC>::forward(void) const {
2017
+ assert(copied());
2018
+ return reinterpret_cast<VarImp<VIC>*>(Support::unmark(idx[0]));
2019
+ }
2020
+
2021
+ template <class VIC>
2022
+ forceinline VarImp<VIC>*
2023
+ VarImp<VIC>::next(void) const {
2024
+ assert(copied());
2025
+ return reinterpret_cast<VarImp<VIC>*>(idx[1]);
2026
+ }
2027
+
2028
+ template <class VIC>
2029
+ forceinline
2030
+ VarImp<VIC>::VarImp(Space* home, bool, VarImp<VIC>& x) {
2031
+ VarImpBase** reg;
2032
+ free_and_bits = x.free_and_bits & ((1 << free_bits) - 1);
2033
+ if (x.idx[0] == NULL) {
2034
+ // Variable implementation needs no index structure
2035
+ for (PropCond i=0; i<pc_max+3; i++)
2036
+ idx[i] = NULL;
2037
+ reg = &home->pc.c.vars_noidx;
2038
+ } else {
2039
+ // Save original values in copy
2040
+ idx[0] = x.idx[0];
2041
+ idx[1] = x.idx[1];
2042
+ reg = &home->pc.c.vars_u[idx_c];
2043
+ }
2044
+ // Set forwarding pointer
2045
+ x.idx[0] = reinterpret_cast<ActorLink**>(Support::mark(this));
2046
+ // Register original
2047
+ x.idx[1] = reinterpret_cast<ActorLink**>(*reg); *reg = &x;
2048
+ }
2049
+
2050
+ template <class VIC>
2051
+ forceinline ModEvent
2052
+ VarImp<VIC>::me(ModEventDelta med) {
2053
+ return static_cast<ModEvent>((med & VIC::med_mask) >> VIC::med_fst);
2054
+ }
2055
+
2056
+ template <class VIC>
2057
+ forceinline ModEventDelta
2058
+ VarImp<VIC>::med(ModEvent me) {
2059
+ return static_cast<ModEventDelta>(me << VIC::med_fst);
2060
+ }
2061
+
2062
+ template <class VIC>
2063
+ forceinline ModEvent
2064
+ VarImp<VIC>::me_combine(ModEvent me1, ModEvent me2) {
2065
+ return VIC::me_combine(me1,me2);
2066
+ }
2067
+
2068
+ template <class VIC>
2069
+ forceinline void
2070
+ VarImp<VIC>::schedule(Space* home, Propagator* p, ModEvent me) {
2071
+ if (VIC::med_update(p->u.med,me))
2072
+ home->enqueue(p);
2073
+ }
2074
+
2075
+ template <class VIC>
2076
+ forceinline void
2077
+ VarImp<VIC>::schedule(Space* home, PropCond pc1, PropCond pc2, ModEvent me) {
2078
+ ActorLink** b = idx[pc1];
2079
+ ActorLink** p = idx[pc2+1];
2080
+ while (p-- > b)
2081
+ schedule(home,Propagator::cast(*p),me);
2082
+ }
2083
+
2084
+ template <class VIC>
2085
+ forceinline void
2086
+ VarImp<VIC>::enter(Space* home, ActorLink* a, PropCond pc) {
2087
+ // Count one new subscription
2088
+ home->pc.p.n_sub += 1;
2089
+ if ((free_and_bits >> free_bits) == 0)
2090
+ resize(home);
2091
+ free_and_bits -= 1 << free_bits;
2092
+ // Enter subscription
2093
+ --idx[0];
2094
+ for (PropCond i = 0; i < pc; i++)
2095
+ *(idx[i]) = *(--idx[i+1]);
2096
+ *idx[pc]=a;
2097
+ }
2098
+
2099
+ template <class VIC>
2100
+ void
2101
+ VarImp<VIC>::resize(Space* home) {
2102
+ if (idx[0] == NULL) {
2103
+ assert((free_and_bits >> free_bits) == 0);
2104
+ // Create fresh dependency array with four entries
2105
+ free_and_bits += 4 << free_bits;
2106
+ ActorLink** prop = static_cast<ActorLink**>
2107
+ (home->alloc(4*sizeof(ActorLink*))) + 4;
2108
+ for (PropCond i=0; i<pc_max+3; i++)
2109
+ idx[i] = prop;
2110
+ } else {
2111
+ // Resize dependency array
2112
+ unsigned int n = static_cast<unsigned int>(idx[pc_max+2] - idx[0]);
2113
+ // Find out whether the area is most likely in the special area
2114
+ // reserved for subscriptions. If yes, just resize mildly otherwise
2115
+ // more agressively
2116
+ ActorLink** s = static_cast<ActorLink**>
2117
+ (home->mm.subscriptions());
2118
+ unsigned int m =
2119
+ ((s <= idx[0]) && (idx[0] < s+home->pc.p.n_sub)) ?
2120
+ (n+4) : ((n+1)*3>>1);
2121
+ ActorLink** prop = static_cast<ActorLink**>
2122
+ (home->alloc(m*sizeof(ActorLink*))) + m-n;
2123
+ free_and_bits += (m-n) << free_bits;
2124
+ // Copy entries
2125
+ memcpy(prop, idx[0], n*sizeof(ActorLink*));
2126
+ home->reuse(idx[0], n*sizeof(ActorLink*));
2127
+ // Update index pointers
2128
+ ptrdiff_t o = prop - idx[0];
2129
+ idx[0] = prop;
2130
+ for (PropCond i = pc_max+2; i > 0; i--)
2131
+ idx[i] += o;
2132
+ }
2133
+ }
2134
+
2135
+ template <class VIC>
2136
+ void
2137
+ VarImp<VIC>::subscribe(Space* home, Propagator* p, PropCond pc,
2138
+ bool assigned, ModEvent me, bool schedule) {
2139
+ if (assigned) {
2140
+ // Do not subscribe, just schedule the propagator
2141
+ if (schedule)
2142
+ VarImp<VIC>::schedule(home,p,ME_GEN_ASSIGNED);
2143
+ } else {
2144
+ enter(home,ActorLink::cast(p),pc);
2145
+ // Schedule propagator
2146
+ if (schedule && (pc != PC_GEN_ASSIGNED))
2147
+ VarImp<VIC>::schedule(home,p,me);
2148
+ }
2149
+ }
2150
+
2151
+ template <class VIC>
2152
+ forceinline void
2153
+ VarImp<VIC>::subscribe(Space* home, Advisor* a, bool assigned) {
2154
+ if (!assigned)
2155
+ enter(home,a,pc_max+1);
2156
+ }
2157
+
2158
+ template <class VIC>
2159
+ forceinline void
2160
+ VarImp<VIC>::remove(Space* home, ActorLink* a, PropCond pc) {
2161
+ /*
2162
+ * The entries are removed from front to back, so when iterating
2163
+ * over dependencies wile removing them it must be done in
2164
+ * forward direction.
2165
+ */
2166
+ ActorLink** f = idx[pc];
2167
+ #ifdef GECODE_AUDIT
2168
+ while (f < idx[pc+1])
2169
+ if (*f == a)
2170
+ goto found;
2171
+ else
2172
+ f++;
2173
+ GECODE_NEVER;
2174
+ found: ;
2175
+ #else
2176
+ while (*f != a) f++;
2177
+ #endif
2178
+ *f=*idx[pc];
2179
+ for (PropCond i=pc; i>0; i--)
2180
+ *(idx[i]++)=*(idx[i-1]);
2181
+ idx[0]++;
2182
+ free_and_bits += 1 << free_bits;
2183
+ home->pc.p.n_sub -= 1;
2184
+ }
2185
+
2186
+ template <class VIC>
2187
+ forceinline void
2188
+ VarImp<VIC>::cancel(Space* home, Propagator* p, PropCond pc, bool assigned) {
2189
+ if (!assigned)
2190
+ remove(home,ActorLink::cast(p),pc);
2191
+ }
2192
+
2193
+ template <class VIC>
2194
+ forceinline void
2195
+ VarImp<VIC>::cancel(Space* home, Advisor* a, bool assigned) {
2196
+ if (!assigned)
2197
+ remove(home,a,pc_max+1);
2198
+ }
2199
+
2200
+ template <class VIC>
2201
+ forceinline void
2202
+ VarImp<VIC>::cancel(Space* home) {
2203
+ // Entries in index structure are disabled. However they
2204
+ // must still work for cloning (idx[0]) and degree (idx[PC+2])
2205
+ ActorLink** b = idx[0]; idx[0] = NULL;
2206
+ ActorLink** p = idx[pc_max+2]; idx[pc_max+2] = NULL;
2207
+ home->pc.p.n_sub -= (p-b);
2208
+ unsigned int n = (free_and_bits >> VIC::free_bits) + (p-b);
2209
+ home->reuse(p-n,n*sizeof(ActorLink*));
2210
+ }
2211
+
2212
+ template <class VIC>
2213
+ forceinline bool
2214
+ VarImp<VIC>::advise(Space* home, ModEvent me, Delta* d) {
2215
+ /*
2216
+ * An advisor that is executed might remove itself due to subsumption.
2217
+ * As entries are removed from front to back, the advisors must
2218
+ * be iterated in forward direction.
2219
+ */
2220
+ ActorLink** la = idx[pc_max+1];
2221
+ ActorLink** le = idx[pc_max+2];
2222
+ if (la == le)
2223
+ return true;
2224
+ d->me = me;
2225
+ // An advisor that is run, might be removed during execution.
2226
+ // As removal is done from the back the advisors have to be executed
2227
+ // in inverse order.
2228
+ do {
2229
+ Advisor* a = Advisor::cast(*la);
2230
+ Propagator* p = a->propagator();
2231
+ switch (p->advise(home,a,d)) {
2232
+ case ES_FIX:
2233
+ break;
2234
+ case ES_FAILED:
2235
+ return false;
2236
+ case ES_NOFIX:
2237
+ schedule(home,p,me);
2238
+ break;
2239
+ default:
2240
+ GECODE_NEVER;
2241
+ }
2242
+ } while (++la < le);
2243
+ return true;
2244
+ }
2245
+
2246
+ template <class VIC>
2247
+ forceinline void
2248
+ VarImp<VIC>::update(VarImp<VIC>* x, ActorLink**& sub) {
2249
+ // this refers to the variable to be updated (clone)
2250
+ // x refers to the original
2251
+ // Recover from copy
2252
+ x->idx[0] = idx[0];
2253
+ ActorLink** f = x->idx[0];
2254
+ x->idx[1] = idx[1];
2255
+ int n = static_cast<int>(x->idx[pc_max+2] - f);
2256
+ ActorLink** t = sub;
2257
+ sub += n;
2258
+ idx[0] = t;
2259
+ ptrdiff_t o = t - f;
2260
+ for (PropCond i = 1; i<pc_max+3; i++)
2261
+ idx[i] = x->idx[i]+o;
2262
+ while ((n-4) >= 0) {
2263
+ n -= 4;
2264
+ t[0]=f[0]->prev(); t[1]=f[1]->prev();
2265
+ t[2]=f[2]->prev(); t[3]=f[3]->prev();
2266
+ t += 4; f += 4;
2267
+ }
2268
+ if ((n-2) >= 0) {
2269
+ n -= 2;
2270
+ t[0]=f[0]->prev(); t[1]=f[1]->prev();
2271
+ t += 2; f += 2;
2272
+ }
2273
+ if (n > 0) {
2274
+ t[0]=f[0]->prev();
2275
+ }
2276
+ }
2277
+
2278
+ template <class VIC>
2279
+ forceinline void
2280
+ VarImp<VIC>::update(Space* home, ActorLink**& sub) {
2281
+ VarImp<VIC>* x = static_cast<VarImp<VIC>*>(home->pc.c.vars_u[idx_c]);
2282
+ while (x != NULL) {
2283
+ VarImp<VIC>* n = x->next(); x->forward()->update(x,sub); x = n;
2284
+ }
2285
+ }
2286
+
2287
+
2288
+
2289
+ /*
2290
+ * Variable disposer
2291
+ *
2292
+ */
2293
+ template <class VarType>
2294
+ VarDisposer<VarType>::VarDisposer(void) {
2295
+ #ifdef GECODE_HAS_VAR_DISPOSE
2296
+ Space::vd[VarType::idx_d] = this;
2297
+ #endif
2298
+ }
2299
+
2300
+ template <class VarType>
2301
+ void
2302
+ VarDisposer<VarType>::dispose(Space* home, VarImpBase* _x) {
2303
+ VarType* x = static_cast<VarType*>(_x);
2304
+ do {
2305
+ x->dispose(home); x = static_cast<VarType*>(x->next_d());
2306
+ } while (x != NULL);
2307
+ }
2308
+
2309
+ }
2310
+
2311
+ // STATISTICS: kernel-core