gecoder-with-gecode 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (634) hide show
  1. data/CHANGES +81 -0
  2. data/COPYING +17 -0
  3. data/LGPL-LICENSE +458 -0
  4. data/README +45 -0
  5. data/Rakefile +13 -0
  6. data/example/example_helper.rb +1 -0
  7. data/example/magic_sequence.rb +43 -0
  8. data/example/queens.rb +43 -0
  9. data/example/raw_bindings.rb +42 -0
  10. data/example/send_more_money.rb +43 -0
  11. data/example/send_most_money.rb +58 -0
  12. data/example/square_tiling.rb +84 -0
  13. data/example/sudoku-set.rb +110 -0
  14. data/example/sudoku.rb +61 -0
  15. data/ext/extconf.rb +29 -0
  16. data/ext/gecode-1.3.1/LICENSE +34 -0
  17. data/ext/gecode-1.3.1/Makefile.contribs +71 -0
  18. data/ext/gecode-1.3.1/Makefile.dep +3928 -0
  19. data/ext/gecode-1.3.1/Makefile.in +966 -0
  20. data/ext/gecode-1.3.1/changelog.in +1065 -0
  21. data/ext/gecode-1.3.1/configure +8590 -0
  22. data/ext/gecode-1.3.1/configure.ac +179 -0
  23. data/ext/gecode-1.3.1/configure.ac.in +175 -0
  24. data/ext/gecode-1.3.1/contribs/README +26 -0
  25. data/ext/gecode-1.3.1/contribs/graph/INSTALL +53 -0
  26. data/ext/gecode-1.3.1/contribs/graph/LICENSE +11 -0
  27. data/ext/gecode-1.3.1/contribs/graph/Makefile +167 -0
  28. data/ext/gecode-1.3.1/contribs/graph/Makefile.in.in +169 -0
  29. data/ext/gecode-1.3.1/contribs/graph/TODO +28 -0
  30. data/ext/gecode-1.3.1/contribs/graph/binarysimple.hh +82 -0
  31. data/ext/gecode-1.3.1/contribs/graph/binarysimple.icc +186 -0
  32. data/ext/gecode-1.3.1/contribs/graph/branch/branch.icc +257 -0
  33. data/ext/gecode-1.3.1/contribs/graph/configure +2160 -0
  34. data/ext/gecode-1.3.1/contribs/graph/configure.ac +33 -0
  35. data/ext/gecode-1.3.1/contribs/graph/doxygen.conf +1226 -0
  36. data/ext/gecode-1.3.1/contribs/graph/doxygen.hh +132 -0
  37. data/ext/gecode-1.3.1/contribs/graph/examples/cpgraph-basic.cc +94 -0
  38. data/ext/gecode-1.3.1/contribs/graph/examples/cpgraph-complement.cc +104 -0
  39. data/ext/gecode-1.3.1/contribs/graph/examples/cpgraph-instUB.cc +105 -0
  40. data/ext/gecode-1.3.1/contribs/graph/examples/cpgraph-path.cc +92 -0
  41. data/ext/gecode-1.3.1/contribs/graph/examples/cpgraph-path2.cc +273 -0
  42. data/ext/gecode-1.3.1/contribs/graph/examples/cpgraph-pathcost.cc +311 -0
  43. data/ext/gecode-1.3.1/contribs/graph/examples/g1.txt +1 -0
  44. data/ext/gecode-1.3.1/contribs/graph/examples/g2.txt +1 -0
  45. data/ext/gecode-1.3.1/contribs/graph/graph.hh +51 -0
  46. data/ext/gecode-1.3.1/contribs/graph/graphutils.h +46 -0
  47. data/ext/gecode-1.3.1/contribs/graph/graphutils.icc +140 -0
  48. data/ext/gecode-1.3.1/contribs/graph/misc/doxygen/footer.html +1 -0
  49. data/ext/gecode-1.3.1/contribs/graph/path.hh +116 -0
  50. data/ext/gecode-1.3.1/contribs/graph/path.icc +64 -0
  51. data/ext/gecode-1.3.1/contribs/graph/path/path.icc +139 -0
  52. data/ext/gecode-1.3.1/contribs/graph/path/pathdegree.icc +133 -0
  53. data/ext/gecode-1.3.1/contribs/graph/path/pathgraphs.icc +341 -0
  54. data/ext/gecode-1.3.1/contribs/graph/shortdesc.ac +1 -0
  55. data/ext/gecode-1.3.1/contribs/graph/stlutility.icc +105 -0
  56. data/ext/gecode-1.3.1/contribs/graph/var.icc +106 -0
  57. data/ext/gecode-1.3.1/contribs/graph/view.icc +373 -0
  58. data/ext/gecode-1.3.1/contribs/graph/view/arcnode.cc +162 -0
  59. data/ext/gecode-1.3.1/contribs/graph/view/arcnode.hh +78 -0
  60. data/ext/gecode-1.3.1/contribs/graph/view/boundsgraphs.icc +349 -0
  61. data/ext/gecode-1.3.1/contribs/graph/view/constant.icc +148 -0
  62. data/ext/gecode-1.3.1/contribs/graph/view/iter.icc +337 -0
  63. data/ext/gecode-1.3.1/contribs/graph/view/nodearcsets.icc +493 -0
  64. data/ext/gecode-1.3.1/contribs/graph/view/nodeset.icc +60 -0
  65. data/ext/gecode-1.3.1/contribs/graph/view/outadjsets.icc +600 -0
  66. data/ext/gecode-1.3.1/contribs/graph/view/prop.icc +135 -0
  67. data/ext/gecode-1.3.1/contribs/map/COMPILING +68 -0
  68. data/ext/gecode-1.3.1/contribs/map/LICENSE +11 -0
  69. data/ext/gecode-1.3.1/contribs/map/Makefile.in.in +173 -0
  70. data/ext/gecode-1.3.1/contribs/map/configure +2285 -0
  71. data/ext/gecode-1.3.1/contribs/map/configure.ac +32 -0
  72. data/ext/gecode-1.3.1/contribs/map/constraints.hh +46 -0
  73. data/ext/gecode-1.3.1/contribs/map/constraints.icc +84 -0
  74. data/ext/gecode-1.3.1/contribs/map/doxygen.conf +1229 -0
  75. data/ext/gecode-1.3.1/contribs/map/doxygen.hh +33 -0
  76. data/ext/gecode-1.3.1/contribs/map/examples/approximateMatching.cc +199 -0
  77. data/ext/gecode-1.3.1/contribs/map/examples/g1.txt +1 -0
  78. data/ext/gecode-1.3.1/contribs/map/examples/g2.txt +1 -0
  79. data/ext/gecode-1.3.1/contribs/map/examples/graph-examples.tgz +0 -0
  80. data/ext/gecode-1.3.1/contribs/map/examples/isomorphism.cc +148 -0
  81. data/ext/gecode-1.3.1/contribs/map/examples/map +0 -0
  82. data/ext/gecode-1.3.1/contribs/map/examples/map.cc +80 -0
  83. data/ext/gecode-1.3.1/contribs/map/examples/subgraphmonomorphism.cc +155 -0
  84. data/ext/gecode-1.3.1/contribs/map/map.hh +65 -0
  85. data/ext/gecode-1.3.1/contribs/map/matching/mono.hh +235 -0
  86. data/ext/gecode-1.3.1/contribs/map/matching/mono.icc +771 -0
  87. data/ext/gecode-1.3.1/contribs/map/shortdesc.ac +2 -0
  88. data/ext/gecode-1.3.1/contribs/map/var.icc +346 -0
  89. data/ext/gecode-1.3.1/contribs/map/var/imp.cc +42 -0
  90. data/ext/gecode-1.3.1/contribs/map/var/imp.icc +436 -0
  91. data/ext/gecode-1.3.1/doxygen.conf.in +1225 -0
  92. data/ext/gecode-1.3.1/doxygen.hh.in +877 -0
  93. data/ext/gecode-1.3.1/examples/all-interval-sort.cc +201 -0
  94. data/ext/gecode-1.3.1/examples/all-interval.cc +114 -0
  95. data/ext/gecode-1.3.1/examples/alpha.cc +112 -0
  96. data/ext/gecode-1.3.1/examples/baseline.cc +71 -0
  97. data/ext/gecode-1.3.1/examples/bibd.cc +173 -0
  98. data/ext/gecode-1.3.1/examples/black-hole.cc +281 -0
  99. data/ext/gecode-1.3.1/examples/cars.cc +165 -0
  100. data/ext/gecode-1.3.1/examples/crew.cc +220 -0
  101. data/ext/gecode-1.3.1/examples/crowded-chess.cc +312 -0
  102. data/ext/gecode-1.3.1/examples/donald.cc +93 -0
  103. data/ext/gecode-1.3.1/examples/eq20.cc +111 -0
  104. data/ext/gecode-1.3.1/examples/golf.cc +242 -0
  105. data/ext/gecode-1.3.1/examples/golomb.cc +141 -0
  106. data/ext/gecode-1.3.1/examples/graph-color.cc +371 -0
  107. data/ext/gecode-1.3.1/examples/grocery.cc +107 -0
  108. data/ext/gecode-1.3.1/examples/hamming.cc +107 -0
  109. data/ext/gecode-1.3.1/examples/ind-set.cc +130 -0
  110. data/ext/gecode-1.3.1/examples/knights.cc +146 -0
  111. data/ext/gecode-1.3.1/examples/langfordnum.cc +244 -0
  112. data/ext/gecode-1.3.1/examples/magic-sequence-gcc.cc +93 -0
  113. data/ext/gecode-1.3.1/examples/magic-sequence.cc +108 -0
  114. data/ext/gecode-1.3.1/examples/magic-square.cc +120 -0
  115. data/ext/gecode-1.3.1/examples/money.cc +92 -0
  116. data/ext/gecode-1.3.1/examples/ortho-latin.cc +156 -0
  117. data/ext/gecode-1.3.1/examples/packing.cc +211 -0
  118. data/ext/gecode-1.3.1/examples/partition.cc +126 -0
  119. data/ext/gecode-1.3.1/examples/photo.cc +155 -0
  120. data/ext/gecode-1.3.1/examples/picture-puzzle.cc +481 -0
  121. data/ext/gecode-1.3.1/examples/queen-armies.cc +240 -0
  122. data/ext/gecode-1.3.1/examples/queens.cc +99 -0
  123. data/ext/gecode-1.3.1/examples/sports-league.cc +454 -0
  124. data/ext/gecode-1.3.1/examples/steiner.cc +148 -0
  125. data/ext/gecode-1.3.1/examples/stress-domain.cc +86 -0
  126. data/ext/gecode-1.3.1/examples/stress-element.cc +95 -0
  127. data/ext/gecode-1.3.1/examples/stress-exec.cc +74 -0
  128. data/ext/gecode-1.3.1/examples/stress-min.cc +84 -0
  129. data/ext/gecode-1.3.1/examples/stress-search.cc +72 -0
  130. data/ext/gecode-1.3.1/examples/sudoku-mixed.cc +282 -0
  131. data/ext/gecode-1.3.1/examples/sudoku-set.cc +162 -0
  132. data/ext/gecode-1.3.1/examples/sudoku.cc +188 -0
  133. data/ext/gecode-1.3.1/examples/sudoku.icc +703 -0
  134. data/ext/gecode-1.3.1/examples/support.cc +160 -0
  135. data/ext/gecode-1.3.1/examples/support.hh +98 -0
  136. data/ext/gecode-1.3.1/examples/support.icc +187 -0
  137. data/ext/gecode-1.3.1/examples/timer.cc +47 -0
  138. data/ext/gecode-1.3.1/examples/timer.hh +72 -0
  139. data/ext/gecode-1.3.1/examples/warehouses.cc +176 -0
  140. data/ext/gecode-1.3.1/extconf.rb +8 -0
  141. data/ext/gecode-1.3.1/gecode.m4 +736 -0
  142. data/ext/gecode-1.3.1/gecode/config.icc.in +50 -0
  143. data/ext/gecode-1.3.1/gecode/int.hh +1426 -0
  144. data/ext/gecode-1.3.1/gecode/int/arithmetic.cc +87 -0
  145. data/ext/gecode-1.3.1/gecode/int/arithmetic.hh +292 -0
  146. data/ext/gecode-1.3.1/gecode/int/arithmetic/abs.icc +213 -0
  147. data/ext/gecode-1.3.1/gecode/int/arithmetic/max.icc +196 -0
  148. data/ext/gecode-1.3.1/gecode/int/arithmetic/mult.icc +478 -0
  149. data/ext/gecode-1.3.1/gecode/int/array.cc +61 -0
  150. data/ext/gecode-1.3.1/gecode/int/array.icc +264 -0
  151. data/ext/gecode-1.3.1/gecode/int/bool.cc +187 -0
  152. data/ext/gecode-1.3.1/gecode/int/bool.hh +255 -0
  153. data/ext/gecode-1.3.1/gecode/int/bool/base.icc +123 -0
  154. data/ext/gecode-1.3.1/gecode/int/bool/eq.icc +89 -0
  155. data/ext/gecode-1.3.1/gecode/int/bool/eqv.icc +132 -0
  156. data/ext/gecode-1.3.1/gecode/int/bool/or.icc +380 -0
  157. data/ext/gecode-1.3.1/gecode/int/branch.cc +81 -0
  158. data/ext/gecode-1.3.1/gecode/int/branch.hh +444 -0
  159. data/ext/gecode-1.3.1/gecode/int/branch/assign.cc +83 -0
  160. data/ext/gecode-1.3.1/gecode/int/branch/assign.icc +76 -0
  161. data/ext/gecode-1.3.1/gecode/int/branch/select-val.icc +104 -0
  162. data/ext/gecode-1.3.1/gecode/int/branch/select-view.icc +219 -0
  163. data/ext/gecode-1.3.1/gecode/int/channel.cc +62 -0
  164. data/ext/gecode-1.3.1/gecode/int/channel.hh +144 -0
  165. data/ext/gecode-1.3.1/gecode/int/channel/base.icc +60 -0
  166. data/ext/gecode-1.3.1/gecode/int/channel/dom.icc +313 -0
  167. data/ext/gecode-1.3.1/gecode/int/channel/stack.icc +59 -0
  168. data/ext/gecode-1.3.1/gecode/int/channel/val.icc +239 -0
  169. data/ext/gecode-1.3.1/gecode/int/count.cc +174 -0
  170. data/ext/gecode-1.3.1/gecode/int/count.hh +401 -0
  171. data/ext/gecode-1.3.1/gecode/int/count/int.icc +495 -0
  172. data/ext/gecode-1.3.1/gecode/int/count/rel.icc +100 -0
  173. data/ext/gecode-1.3.1/gecode/int/count/view.icc +332 -0
  174. data/ext/gecode-1.3.1/gecode/int/cumulatives.cc +210 -0
  175. data/ext/gecode-1.3.1/gecode/int/cumulatives.hh +118 -0
  176. data/ext/gecode-1.3.1/gecode/int/cumulatives/val.icc +377 -0
  177. data/ext/gecode-1.3.1/gecode/int/distinct.cc +77 -0
  178. data/ext/gecode-1.3.1/gecode/int/distinct.hh +272 -0
  179. data/ext/gecode-1.3.1/gecode/int/distinct/bilink.icc +73 -0
  180. data/ext/gecode-1.3.1/gecode/int/distinct/bnd.icc +335 -0
  181. data/ext/gecode-1.3.1/gecode/int/distinct/combptr.icc +62 -0
  182. data/ext/gecode-1.3.1/gecode/int/distinct/dom.icc +740 -0
  183. data/ext/gecode-1.3.1/gecode/int/distinct/edge.icc +96 -0
  184. data/ext/gecode-1.3.1/gecode/int/distinct/node.icc +107 -0
  185. data/ext/gecode-1.3.1/gecode/int/distinct/ter-dom.icc +97 -0
  186. data/ext/gecode-1.3.1/gecode/int/distinct/val.icc +171 -0
  187. data/ext/gecode-1.3.1/gecode/int/dom.cc +81 -0
  188. data/ext/gecode-1.3.1/gecode/int/dom.hh +101 -0
  189. data/ext/gecode-1.3.1/gecode/int/dom/range.icc +85 -0
  190. data/ext/gecode-1.3.1/gecode/int/dom/spec.icc +85 -0
  191. data/ext/gecode-1.3.1/gecode/int/element.cc +58 -0
  192. data/ext/gecode-1.3.1/gecode/int/element.hh +203 -0
  193. data/ext/gecode-1.3.1/gecode/int/element/int.icc +396 -0
  194. data/ext/gecode-1.3.1/gecode/int/element/view.icc +443 -0
  195. data/ext/gecode-1.3.1/gecode/int/exception.icc +137 -0
  196. data/ext/gecode-1.3.1/gecode/int/gcc.cc +708 -0
  197. data/ext/gecode-1.3.1/gecode/int/gcc.hh +338 -0
  198. data/ext/gecode-1.3.1/gecode/int/gcc/bnd.icc +629 -0
  199. data/ext/gecode-1.3.1/gecode/int/gcc/dom.icc +504 -0
  200. data/ext/gecode-1.3.1/gecode/int/gcc/gccbndsup.icc +760 -0
  201. data/ext/gecode-1.3.1/gecode/int/gcc/graphsup.icc +2375 -0
  202. data/ext/gecode-1.3.1/gecode/int/gcc/lbc.icc +375 -0
  203. data/ext/gecode-1.3.1/gecode/int/gcc/occur.icc +687 -0
  204. data/ext/gecode-1.3.1/gecode/int/gcc/ubc.icc +236 -0
  205. data/ext/gecode-1.3.1/gecode/int/gcc/val.icc +373 -0
  206. data/ext/gecode-1.3.1/gecode/int/int-set.cc +115 -0
  207. data/ext/gecode-1.3.1/gecode/int/int-set.icc +151 -0
  208. data/ext/gecode-1.3.1/gecode/int/linear.cc +247 -0
  209. data/ext/gecode-1.3.1/gecode/int/linear.hh +1056 -0
  210. data/ext/gecode-1.3.1/gecode/int/linear/binary.icc +439 -0
  211. data/ext/gecode-1.3.1/gecode/int/linear/bool-int.icc +422 -0
  212. data/ext/gecode-1.3.1/gecode/int/linear/bool-view.icc +311 -0
  213. data/ext/gecode-1.3.1/gecode/int/linear/dom.icc +503 -0
  214. data/ext/gecode-1.3.1/gecode/int/linear/nary.icc +857 -0
  215. data/ext/gecode-1.3.1/gecode/int/linear/noview.icc +264 -0
  216. data/ext/gecode-1.3.1/gecode/int/linear/post.cc +542 -0
  217. data/ext/gecode-1.3.1/gecode/int/linear/ternary.icc +255 -0
  218. data/ext/gecode-1.3.1/gecode/int/propagator.icc +194 -0
  219. data/ext/gecode-1.3.1/gecode/int/regular.cc +40 -0
  220. data/ext/gecode-1.3.1/gecode/int/regular.hh +83 -0
  221. data/ext/gecode-1.3.1/gecode/int/regular/dfa.cc +466 -0
  222. data/ext/gecode-1.3.1/gecode/int/regular/dfa.icc +172 -0
  223. data/ext/gecode-1.3.1/gecode/int/regular/dom.icc +480 -0
  224. data/ext/gecode-1.3.1/gecode/int/regular/reg.cc +738 -0
  225. data/ext/gecode-1.3.1/gecode/int/rel.cc +293 -0
  226. data/ext/gecode-1.3.1/gecode/int/rel.hh +526 -0
  227. data/ext/gecode-1.3.1/gecode/int/rel/eq.icc +640 -0
  228. data/ext/gecode-1.3.1/gecode/int/rel/lex.icc +212 -0
  229. data/ext/gecode-1.3.1/gecode/int/rel/lq-le.icc +246 -0
  230. data/ext/gecode-1.3.1/gecode/int/rel/nq.icc +188 -0
  231. data/ext/gecode-1.3.1/gecode/int/sortedness.cc +124 -0
  232. data/ext/gecode-1.3.1/gecode/int/sortedness.hh +108 -0
  233. data/ext/gecode-1.3.1/gecode/int/sortedness/matching.icc +177 -0
  234. data/ext/gecode-1.3.1/gecode/int/sortedness/narrowing.icc +243 -0
  235. data/ext/gecode-1.3.1/gecode/int/sortedness/order.icc +232 -0
  236. data/ext/gecode-1.3.1/gecode/int/sortedness/sortedness.icc +727 -0
  237. data/ext/gecode-1.3.1/gecode/int/sortedness/sortsup.icc +666 -0
  238. data/ext/gecode-1.3.1/gecode/int/var-imp.vis +198 -0
  239. data/ext/gecode-1.3.1/gecode/int/var.icc +590 -0
  240. data/ext/gecode-1.3.1/gecode/int/var/bool.icc +52 -0
  241. data/ext/gecode-1.3.1/gecode/int/var/imp-body.icc +65 -0
  242. data/ext/gecode-1.3.1/gecode/int/var/imp-hdr.icc +191 -0
  243. data/ext/gecode-1.3.1/gecode/int/var/imp.cc +361 -0
  244. data/ext/gecode-1.3.1/gecode/int/var/imp.icc +579 -0
  245. data/ext/gecode-1.3.1/gecode/int/var/int.cc +63 -0
  246. data/ext/gecode-1.3.1/gecode/int/var/int.icc +135 -0
  247. data/ext/gecode-1.3.1/gecode/int/view.icc +1219 -0
  248. data/ext/gecode-1.3.1/gecode/int/view/bool.icc +270 -0
  249. data/ext/gecode-1.3.1/gecode/int/view/constint.icc +306 -0
  250. data/ext/gecode-1.3.1/gecode/int/view/int.icc +221 -0
  251. data/ext/gecode-1.3.1/gecode/int/view/iter.icc +49 -0
  252. data/ext/gecode-1.3.1/gecode/int/view/minus.icc +285 -0
  253. data/ext/gecode-1.3.1/gecode/int/view/offset.icc +274 -0
  254. data/ext/gecode-1.3.1/gecode/int/view/print.cc +109 -0
  255. data/ext/gecode-1.3.1/gecode/int/view/rtest.icc +215 -0
  256. data/ext/gecode-1.3.1/gecode/int/view/scale.icc +373 -0
  257. data/ext/gecode-1.3.1/gecode/iter.hh +65 -0
  258. data/ext/gecode-1.3.1/gecode/iter/ranges-add.icc +130 -0
  259. data/ext/gecode-1.3.1/gecode/iter/ranges-append.icc +208 -0
  260. data/ext/gecode-1.3.1/gecode/iter/ranges-array.icc +123 -0
  261. data/ext/gecode-1.3.1/gecode/iter/ranges-cache.icc +143 -0
  262. data/ext/gecode-1.3.1/gecode/iter/ranges-compl.icc +206 -0
  263. data/ext/gecode-1.3.1/gecode/iter/ranges-diff.icc +127 -0
  264. data/ext/gecode-1.3.1/gecode/iter/ranges-empty.icc +96 -0
  265. data/ext/gecode-1.3.1/gecode/iter/ranges-inter.icc +202 -0
  266. data/ext/gecode-1.3.1/gecode/iter/ranges-minmax.icc +103 -0
  267. data/ext/gecode-1.3.1/gecode/iter/ranges-minus.icc +138 -0
  268. data/ext/gecode-1.3.1/gecode/iter/ranges-offset.icc +112 -0
  269. data/ext/gecode-1.3.1/gecode/iter/ranges-operations.icc +142 -0
  270. data/ext/gecode-1.3.1/gecode/iter/ranges-scale.icc +224 -0
  271. data/ext/gecode-1.3.1/gecode/iter/ranges-singleton.icc +71 -0
  272. data/ext/gecode-1.3.1/gecode/iter/ranges-size.icc +131 -0
  273. data/ext/gecode-1.3.1/gecode/iter/ranges-union.icc +211 -0
  274. data/ext/gecode-1.3.1/gecode/iter/ranges-values.icc +125 -0
  275. data/ext/gecode-1.3.1/gecode/iter/values-ranges.icc +91 -0
  276. data/ext/gecode-1.3.1/gecode/iter/virtual-ranges-compl.icc +247 -0
  277. data/ext/gecode-1.3.1/gecode/iter/virtual-ranges-inter.icc +227 -0
  278. data/ext/gecode-1.3.1/gecode/iter/virtual-ranges-union.icc +236 -0
  279. data/ext/gecode-1.3.1/gecode/iter/virtual-ranges.icc +126 -0
  280. data/ext/gecode-1.3.1/gecode/kernel.hh +141 -0
  281. data/ext/gecode-1.3.1/gecode/kernel/array.icc +954 -0
  282. data/ext/gecode-1.3.1/gecode/kernel/branching.icc +233 -0
  283. data/ext/gecode-1.3.1/gecode/kernel/core.cc +417 -0
  284. data/ext/gecode-1.3.1/gecode/kernel/core.icc +1681 -0
  285. data/ext/gecode-1.3.1/gecode/kernel/exception.cc +49 -0
  286. data/ext/gecode-1.3.1/gecode/kernel/exception.icc +104 -0
  287. data/ext/gecode-1.3.1/gecode/kernel/macros.icc +98 -0
  288. data/ext/gecode-1.3.1/gecode/kernel/memory-manager.cc +41 -0
  289. data/ext/gecode-1.3.1/gecode/kernel/memory-manager.icc +438 -0
  290. data/ext/gecode-1.3.1/gecode/kernel/memory.icc +205 -0
  291. data/ext/gecode-1.3.1/gecode/kernel/modevent.icc +53 -0
  292. data/ext/gecode-1.3.1/gecode/kernel/propagator.icc +680 -0
  293. data/ext/gecode-1.3.1/gecode/kernel/view.icc +583 -0
  294. data/ext/gecode-1.3.1/gecode/limits.hh +87 -0
  295. data/ext/gecode-1.3.1/gecode/minimodel.hh +942 -0
  296. data/ext/gecode-1.3.1/gecode/minimodel/arithmetic.cc +137 -0
  297. data/ext/gecode-1.3.1/gecode/minimodel/bool-expr.cc +207 -0
  298. data/ext/gecode-1.3.1/gecode/minimodel/bool-expr.icc +191 -0
  299. data/ext/gecode-1.3.1/gecode/minimodel/bool-rel.icc +66 -0
  300. data/ext/gecode-1.3.1/gecode/minimodel/exception.icc +59 -0
  301. data/ext/gecode-1.3.1/gecode/minimodel/lin-expr.cc +103 -0
  302. data/ext/gecode-1.3.1/gecode/minimodel/lin-expr.icc +192 -0
  303. data/ext/gecode-1.3.1/gecode/minimodel/lin-rel.icc +200 -0
  304. data/ext/gecode-1.3.1/gecode/minimodel/matrix.icc +118 -0
  305. data/ext/gecode-1.3.1/gecode/minimodel/scheduling.cc +241 -0
  306. data/ext/gecode-1.3.1/gecode/search.hh +745 -0
  307. data/ext/gecode-1.3.1/gecode/search/bab.cc +153 -0
  308. data/ext/gecode-1.3.1/gecode/search/bab.icc +101 -0
  309. data/ext/gecode-1.3.1/gecode/search/dfs.cc +63 -0
  310. data/ext/gecode-1.3.1/gecode/search/dfs.icc +144 -0
  311. data/ext/gecode-1.3.1/gecode/search/engine-ctrl.icc +109 -0
  312. data/ext/gecode-1.3.1/gecode/search/lds.cc +237 -0
  313. data/ext/gecode-1.3.1/gecode/search/lds.icc +57 -0
  314. data/ext/gecode-1.3.1/gecode/search/reco-stack.icc +219 -0
  315. data/ext/gecode-1.3.1/gecode/search/restart.icc +76 -0
  316. data/ext/gecode-1.3.1/gecode/search/statistics.icc +30 -0
  317. data/ext/gecode-1.3.1/gecode/search/stop.cc +58 -0
  318. data/ext/gecode-1.3.1/gecode/search/stop.icc +100 -0
  319. data/ext/gecode-1.3.1/gecode/set.hh +419 -0
  320. data/ext/gecode-1.3.1/gecode/set/array.cc +114 -0
  321. data/ext/gecode-1.3.1/gecode/set/array.icc +134 -0
  322. data/ext/gecode-1.3.1/gecode/set/branch.cc +57 -0
  323. data/ext/gecode-1.3.1/gecode/set/branch.hh +176 -0
  324. data/ext/gecode-1.3.1/gecode/set/branch/select-val.icc +72 -0
  325. data/ext/gecode-1.3.1/gecode/set/branch/select-view.icc +112 -0
  326. data/ext/gecode-1.3.1/gecode/set/cardinality.cc +49 -0
  327. data/ext/gecode-1.3.1/gecode/set/convex.cc +43 -0
  328. data/ext/gecode-1.3.1/gecode/set/convex.hh +92 -0
  329. data/ext/gecode-1.3.1/gecode/set/convex/conv.cc +81 -0
  330. data/ext/gecode-1.3.1/gecode/set/convex/conv.icc +51 -0
  331. data/ext/gecode-1.3.1/gecode/set/convex/hull.cc +100 -0
  332. data/ext/gecode-1.3.1/gecode/set/convex/hull.icc +52 -0
  333. data/ext/gecode-1.3.1/gecode/set/distinct.cc +48 -0
  334. data/ext/gecode-1.3.1/gecode/set/distinct.hh +97 -0
  335. data/ext/gecode-1.3.1/gecode/set/distinct/atmostOne.cc +151 -0
  336. data/ext/gecode-1.3.1/gecode/set/distinct/atmostOne.icc +50 -0
  337. data/ext/gecode-1.3.1/gecode/set/distinct/binomial.cc +46 -0
  338. data/ext/gecode-1.3.1/gecode/set/distinct/binomial.icc +157 -0
  339. data/ext/gecode-1.3.1/gecode/set/distinct/distinct.cc +124 -0
  340. data/ext/gecode-1.3.1/gecode/set/distinct/distinct.icc +58 -0
  341. data/ext/gecode-1.3.1/gecode/set/dom.cc +224 -0
  342. data/ext/gecode-1.3.1/gecode/set/exception.icc +132 -0
  343. data/ext/gecode-1.3.1/gecode/set/int.cc +139 -0
  344. data/ext/gecode-1.3.1/gecode/set/int.hh +226 -0
  345. data/ext/gecode-1.3.1/gecode/set/int/card.cc +61 -0
  346. data/ext/gecode-1.3.1/gecode/set/int/card.icc +54 -0
  347. data/ext/gecode-1.3.1/gecode/set/int/channel.cc +100 -0
  348. data/ext/gecode-1.3.1/gecode/set/int/channel.icc +75 -0
  349. data/ext/gecode-1.3.1/gecode/set/int/match.cc +148 -0
  350. data/ext/gecode-1.3.1/gecode/set/int/match.icc +67 -0
  351. data/ext/gecode-1.3.1/gecode/set/int/minmax.cc +109 -0
  352. data/ext/gecode-1.3.1/gecode/set/int/minmax.icc +63 -0
  353. data/ext/gecode-1.3.1/gecode/set/int/weights.cc +182 -0
  354. data/ext/gecode-1.3.1/gecode/set/int/weights.icc +174 -0
  355. data/ext/gecode-1.3.1/gecode/set/projectors-compiler.hh +148 -0
  356. data/ext/gecode-1.3.1/gecode/set/projectors.cc +109 -0
  357. data/ext/gecode-1.3.1/gecode/set/projectors.hh +319 -0
  358. data/ext/gecode-1.3.1/gecode/set/projectors/compiler.cc +841 -0
  359. data/ext/gecode-1.3.1/gecode/set/projectors/projector-set.cc +69 -0
  360. data/ext/gecode-1.3.1/gecode/set/projectors/projector-set.icc +66 -0
  361. data/ext/gecode-1.3.1/gecode/set/projectors/projector.cc +125 -0
  362. data/ext/gecode-1.3.1/gecode/set/projectors/projector.icc +79 -0
  363. data/ext/gecode-1.3.1/gecode/set/projectors/propagator.hh +127 -0
  364. data/ext/gecode-1.3.1/gecode/set/projectors/propagator/card.icc +96 -0
  365. data/ext/gecode-1.3.1/gecode/set/projectors/propagator/nary.icc +106 -0
  366. data/ext/gecode-1.3.1/gecode/set/projectors/propagator/re-nary.cc +76 -0
  367. data/ext/gecode-1.3.1/gecode/set/projectors/propagator/re-nary.icc +53 -0
  368. data/ext/gecode-1.3.1/gecode/set/projectors/set-expr.cc +306 -0
  369. data/ext/gecode-1.3.1/gecode/set/projectors/set-expr.icc +192 -0
  370. data/ext/gecode-1.3.1/gecode/set/propagator.icc +96 -0
  371. data/ext/gecode-1.3.1/gecode/set/rel-op-const.cc +233 -0
  372. data/ext/gecode-1.3.1/gecode/set/rel-op.cc +96 -0
  373. data/ext/gecode-1.3.1/gecode/set/rel-op.hh +267 -0
  374. data/ext/gecode-1.3.1/gecode/set/rel-op/common.icc +528 -0
  375. data/ext/gecode-1.3.1/gecode/set/rel-op/inter.icc +312 -0
  376. data/ext/gecode-1.3.1/gecode/set/rel-op/partition.icc +131 -0
  377. data/ext/gecode-1.3.1/gecode/set/rel-op/post.icc +198 -0
  378. data/ext/gecode-1.3.1/gecode/set/rel-op/subofunion.icc +150 -0
  379. data/ext/gecode-1.3.1/gecode/set/rel-op/superofinter.icc +151 -0
  380. data/ext/gecode-1.3.1/gecode/set/rel-op/union.icc +292 -0
  381. data/ext/gecode-1.3.1/gecode/set/rel.cc +201 -0
  382. data/ext/gecode-1.3.1/gecode/set/rel.hh +250 -0
  383. data/ext/gecode-1.3.1/gecode/set/rel/common.icc +109 -0
  384. data/ext/gecode-1.3.1/gecode/set/rel/eq.icc +101 -0
  385. data/ext/gecode-1.3.1/gecode/set/rel/nosubset.icc +88 -0
  386. data/ext/gecode-1.3.1/gecode/set/rel/nq.icc +132 -0
  387. data/ext/gecode-1.3.1/gecode/set/rel/re-eq.icc +142 -0
  388. data/ext/gecode-1.3.1/gecode/set/rel/re-subset.icc +121 -0
  389. data/ext/gecode-1.3.1/gecode/set/rel/subset.icc +80 -0
  390. data/ext/gecode-1.3.1/gecode/set/select.cc +88 -0
  391. data/ext/gecode-1.3.1/gecode/set/select.hh +113 -0
  392. data/ext/gecode-1.3.1/gecode/set/select/disjoint.cc +267 -0
  393. data/ext/gecode-1.3.1/gecode/set/select/disjoint.icc +59 -0
  394. data/ext/gecode-1.3.1/gecode/set/select/idxarray.hh +91 -0
  395. data/ext/gecode-1.3.1/gecode/set/select/idxarray.icc +112 -0
  396. data/ext/gecode-1.3.1/gecode/set/select/inter.icc +300 -0
  397. data/ext/gecode-1.3.1/gecode/set/sequence.cc +48 -0
  398. data/ext/gecode-1.3.1/gecode/set/sequence.hh +97 -0
  399. data/ext/gecode-1.3.1/gecode/set/sequence/common.icc +79 -0
  400. data/ext/gecode-1.3.1/gecode/set/sequence/seq-u.cc +83 -0
  401. data/ext/gecode-1.3.1/gecode/set/sequence/seq-u.icc +63 -0
  402. data/ext/gecode-1.3.1/gecode/set/sequence/seq.cc +61 -0
  403. data/ext/gecode-1.3.1/gecode/set/sequence/seq.icc +53 -0
  404. data/ext/gecode-1.3.1/gecode/set/var-imp.vis +205 -0
  405. data/ext/gecode-1.3.1/gecode/set/var.icc +1090 -0
  406. data/ext/gecode-1.3.1/gecode/set/var/imp-body.icc +192 -0
  407. data/ext/gecode-1.3.1/gecode/set/var/imp-hdr.icc +235 -0
  408. data/ext/gecode-1.3.1/gecode/set/var/imp.cc +127 -0
  409. data/ext/gecode-1.3.1/gecode/set/var/imp.icc +356 -0
  410. data/ext/gecode-1.3.1/gecode/set/var/integerset.cc +256 -0
  411. data/ext/gecode-1.3.1/gecode/set/var/integerset.icc +512 -0
  412. data/ext/gecode-1.3.1/gecode/set/var/iter.icc +47 -0
  413. data/ext/gecode-1.3.1/gecode/set/var/set.cc +99 -0
  414. data/ext/gecode-1.3.1/gecode/set/var/set.icc +282 -0
  415. data/ext/gecode-1.3.1/gecode/set/view.icc +1075 -0
  416. data/ext/gecode-1.3.1/gecode/set/view/complement.icc +525 -0
  417. data/ext/gecode-1.3.1/gecode/set/view/const.icc +651 -0
  418. data/ext/gecode-1.3.1/gecode/set/view/print.cc +120 -0
  419. data/ext/gecode-1.3.1/gecode/set/view/set.icc +217 -0
  420. data/ext/gecode-1.3.1/gecode/set/view/singleton.icc +348 -0
  421. data/ext/gecode-1.3.1/gecode/support/block-allocator.hh +152 -0
  422. data/ext/gecode-1.3.1/gecode/support/dynamic-array.hh +131 -0
  423. data/ext/gecode-1.3.1/gecode/support/dynamic-stack.hh +157 -0
  424. data/ext/gecode-1.3.1/gecode/support/random.hh +100 -0
  425. data/ext/gecode-1.3.1/gecode/support/shared-array.hh +255 -0
  426. data/ext/gecode-1.3.1/gecode/support/sort.hh +193 -0
  427. data/ext/gecode-1.3.1/gecode/support/static-pqueue.hh +240 -0
  428. data/ext/gecode-1.3.1/gecode/support/static-stack.hh +117 -0
  429. data/ext/gecode-1.3.1/install-sh +323 -0
  430. data/ext/gecode-1.3.1/misc/debian/Makefile.am +8 -0
  431. data/ext/gecode-1.3.1/misc/debian/changelog +6 -0
  432. data/ext/gecode-1.3.1/misc/debian/control +11 -0
  433. data/ext/gecode-1.3.1/misc/debian/copyright +44 -0
  434. data/ext/gecode-1.3.1/misc/debian/gecode.info +9 -0
  435. data/ext/gecode-1.3.1/misc/debian/gecode.install +2 -0
  436. data/ext/gecode-1.3.1/misc/debian/gecode.spec +58 -0
  437. data/ext/gecode-1.3.1/misc/debian/rules +81 -0
  438. data/ext/gecode-1.3.1/misc/doxygen/back.png +0 -0
  439. data/ext/gecode-1.3.1/misc/doxygen/footer.html +3 -0
  440. data/ext/gecode-1.3.1/misc/doxygen/gecode-logo-100.png +0 -0
  441. data/ext/gecode-1.3.1/misc/doxygen/header.html +46 -0
  442. data/ext/gecode-1.3.1/misc/doxygen/stylesheet.css +460 -0
  443. data/ext/gecode-1.3.1/misc/fixproperties.sh +32 -0
  444. data/ext/gecode-1.3.1/misc/gecode-minimodel.pc.in +12 -0
  445. data/ext/gecode-1.3.1/misc/gecode-search.pc.in +12 -0
  446. data/ext/gecode-1.3.1/misc/gecode.pc.in +12 -0
  447. data/ext/gecode-1.3.1/misc/genchangelog.perl +190 -0
  448. data/ext/gecode-1.3.1/misc/genlicense.perl +113 -0
  449. data/ext/gecode-1.3.1/misc/genstatistics.perl +155 -0
  450. data/ext/gecode-1.3.1/misc/gentxtchangelog.perl +170 -0
  451. data/ext/gecode-1.3.1/misc/genvarimp.perl +666 -0
  452. data/ext/gecode-1.3.1/misc/getrevision.perl +32 -0
  453. data/ext/gecode-1.3.1/misc/makedepend.perl +66 -0
  454. data/ext/gecode-1.3.1/test/int.cc +497 -0
  455. data/ext/gecode-1.3.1/test/int.hh +119 -0
  456. data/ext/gecode-1.3.1/test/int/arithmetic.cc +262 -0
  457. data/ext/gecode-1.3.1/test/int/basic.cc +42 -0
  458. data/ext/gecode-1.3.1/test/int/bool.cc +189 -0
  459. data/ext/gecode-1.3.1/test/int/channel.cc +79 -0
  460. data/ext/gecode-1.3.1/test/int/count.cc +264 -0
  461. data/ext/gecode-1.3.1/test/int/distinct.cc +121 -0
  462. data/ext/gecode-1.3.1/test/int/dom.cc +69 -0
  463. data/ext/gecode-1.3.1/test/int/element.cc +132 -0
  464. data/ext/gecode-1.3.1/test/int/gcc.cc +592 -0
  465. data/ext/gecode-1.3.1/test/int/linear.cc +315 -0
  466. data/ext/gecode-1.3.1/test/int/minimodel.cc +451 -0
  467. data/ext/gecode-1.3.1/test/int/regular.cc +105 -0
  468. data/ext/gecode-1.3.1/test/int/rel.cc +283 -0
  469. data/ext/gecode-1.3.1/test/int/scheduling.cc +259 -0
  470. data/ext/gecode-1.3.1/test/int/sortedness.cc +272 -0
  471. data/ext/gecode-1.3.1/test/intset.cc +40 -0
  472. data/ext/gecode-1.3.1/test/log.cc +515 -0
  473. data/ext/gecode-1.3.1/test/log.hh +68 -0
  474. data/ext/gecode-1.3.1/test/set.cc +542 -0
  475. data/ext/gecode-1.3.1/test/set.hh +152 -0
  476. data/ext/gecode-1.3.1/test/set/convex.cc +94 -0
  477. data/ext/gecode-1.3.1/test/set/distinct.cc +148 -0
  478. data/ext/gecode-1.3.1/test/set/dom.cc +67 -0
  479. data/ext/gecode-1.3.1/test/set/int.cc +249 -0
  480. data/ext/gecode-1.3.1/test/set/projection.cc +333 -0
  481. data/ext/gecode-1.3.1/test/set/rel-op.cc +662 -0
  482. data/ext/gecode-1.3.1/test/set/rel.cc +198 -0
  483. data/ext/gecode-1.3.1/test/set/select.cc +108 -0
  484. data/ext/gecode-1.3.1/test/set/sequence.cc +83 -0
  485. data/ext/gecode-1.3.1/test/stress.cc +93 -0
  486. data/ext/gecode-1.3.1/test/stress.hh +74 -0
  487. data/ext/gecode-1.3.1/test/stress/distinct.cc +70 -0
  488. data/ext/gecode-1.3.1/test/stress/domain.cc +69 -0
  489. data/ext/gecode-1.3.1/test/stress/exec.cc +60 -0
  490. data/ext/gecode-1.3.1/test/stress/minsort.cc +63 -0
  491. data/ext/gecode-1.3.1/test/stress/regular.cc +112 -0
  492. data/ext/gecode-1.3.1/test/test.cc +215 -0
  493. data/ext/gecode-1.3.1/test/test.hh +107 -0
  494. data/ext/missing.cpp +328 -0
  495. data/ext/missing.h +120 -0
  496. data/ext/vararray.cpp +330 -0
  497. data/ext/vararray.h +149 -0
  498. data/lib/gecoder.rb +5 -0
  499. data/lib/gecoder/bindings.rb +34 -0
  500. data/lib/gecoder/bindings/bindings.rb +2209 -0
  501. data/lib/gecoder/interface.rb +8 -0
  502. data/lib/gecoder/interface/binding_changes.rb +313 -0
  503. data/lib/gecoder/interface/branch.rb +152 -0
  504. data/lib/gecoder/interface/constraints.rb +397 -0
  505. data/lib/gecoder/interface/constraints/bool/boolean.rb +246 -0
  506. data/lib/gecoder/interface/constraints/bool/linear.rb +29 -0
  507. data/lib/gecoder/interface/constraints/bool_enum/boolean.rb +84 -0
  508. data/lib/gecoder/interface/constraints/bool_enum_constraints.rb +8 -0
  509. data/lib/gecoder/interface/constraints/bool_var_constraints.rb +75 -0
  510. data/lib/gecoder/interface/constraints/int/arithmetic.rb +71 -0
  511. data/lib/gecoder/interface/constraints/int/domain.rb +78 -0
  512. data/lib/gecoder/interface/constraints/int/linear.rb +295 -0
  513. data/lib/gecoder/interface/constraints/int_enum/arithmetic.rb +72 -0
  514. data/lib/gecoder/interface/constraints/int_enum/channel.rb +100 -0
  515. data/lib/gecoder/interface/constraints/int_enum/count.rb +92 -0
  516. data/lib/gecoder/interface/constraints/int_enum/distinct.rb +69 -0
  517. data/lib/gecoder/interface/constraints/int_enum/element.rb +82 -0
  518. data/lib/gecoder/interface/constraints/int_enum/equality.rb +38 -0
  519. data/lib/gecoder/interface/constraints/int_enum/sort.rb +126 -0
  520. data/lib/gecoder/interface/constraints/int_enum_constraints.rb +37 -0
  521. data/lib/gecoder/interface/constraints/int_var_constraints.rb +58 -0
  522. data/lib/gecoder/interface/constraints/reifiable_constraints.rb +78 -0
  523. data/lib/gecoder/interface/constraints/set/cardinality.rb +75 -0
  524. data/lib/gecoder/interface/constraints/set/connection.rb +193 -0
  525. data/lib/gecoder/interface/constraints/set/domain.rb +109 -0
  526. data/lib/gecoder/interface/constraints/set/operation.rb +132 -0
  527. data/lib/gecoder/interface/constraints/set/relation.rb +178 -0
  528. data/lib/gecoder/interface/constraints/set_enum/channel.rb +18 -0
  529. data/lib/gecoder/interface/constraints/set_enum/distinct.rb +80 -0
  530. data/lib/gecoder/interface/constraints/set_enum/operation.rb +60 -0
  531. data/lib/gecoder/interface/constraints/set_enum/selection.rb +217 -0
  532. data/lib/gecoder/interface/constraints/set_enum_constraints.rb +34 -0
  533. data/lib/gecoder/interface/constraints/set_var_constraints.rb +72 -0
  534. data/lib/gecoder/interface/enum_matrix.rb +64 -0
  535. data/lib/gecoder/interface/enum_wrapper.rb +153 -0
  536. data/lib/gecoder/interface/model.rb +251 -0
  537. data/lib/gecoder/interface/search.rb +123 -0
  538. data/lib/gecoder/interface/variables.rb +254 -0
  539. data/lib/gecoder/version.rb +4 -0
  540. data/specs/binding_changes.rb +76 -0
  541. data/specs/bool_var.rb +74 -0
  542. data/specs/branch.rb +170 -0
  543. data/specs/constraints/arithmetic.rb +266 -0
  544. data/specs/constraints/bool_enum.rb +140 -0
  545. data/specs/constraints/boolean.rb +232 -0
  546. data/specs/constraints/cardinality.rb +154 -0
  547. data/specs/constraints/channel.rb +126 -0
  548. data/specs/constraints/connection.rb +373 -0
  549. data/specs/constraints/constraint_helper.rb +180 -0
  550. data/specs/constraints/constraints.rb +74 -0
  551. data/specs/constraints/count.rb +139 -0
  552. data/specs/constraints/distinct.rb +218 -0
  553. data/specs/constraints/element.rb +106 -0
  554. data/specs/constraints/equality.rb +31 -0
  555. data/specs/constraints/int_domain.rb +69 -0
  556. data/specs/constraints/int_relation.rb +78 -0
  557. data/specs/constraints/linear.rb +332 -0
  558. data/specs/constraints/reification_sugar.rb +96 -0
  559. data/specs/constraints/selection.rb +292 -0
  560. data/specs/constraints/set_domain.rb +181 -0
  561. data/specs/constraints/set_operation.rb +285 -0
  562. data/specs/constraints/set_relation.rb +201 -0
  563. data/specs/constraints/sort.rb +175 -0
  564. data/specs/enum_matrix.rb +43 -0
  565. data/specs/enum_wrapper.rb +122 -0
  566. data/specs/int_var.rb +144 -0
  567. data/specs/logging.rb +24 -0
  568. data/specs/model.rb +190 -0
  569. data/specs/search.rb +246 -0
  570. data/specs/set_var.rb +68 -0
  571. data/specs/spec_helper.rb +93 -0
  572. data/tasks/all_tasks.rb +1 -0
  573. data/tasks/distribution.rake +129 -0
  574. data/tasks/rcov.rake +17 -0
  575. data/tasks/specs.rake +15 -0
  576. data/tasks/svn.rake +11 -0
  577. data/tasks/website.rake +51 -0
  578. data/vendor/rust/README +28 -0
  579. data/vendor/rust/bin/cxxgenerator.rb +93 -0
  580. data/vendor/rust/include/rust_checks.hh +115 -0
  581. data/vendor/rust/include/rust_conversions.hh +102 -0
  582. data/vendor/rust/rust.rb +67 -0
  583. data/vendor/rust/rust/attribute.rb +51 -0
  584. data/vendor/rust/rust/bindings.rb +172 -0
  585. data/vendor/rust/rust/class.rb +339 -0
  586. data/vendor/rust/rust/constants.rb +48 -0
  587. data/vendor/rust/rust/container.rb +110 -0
  588. data/vendor/rust/rust/cppifaceparser.rb +129 -0
  589. data/vendor/rust/rust/cwrapper.rb +72 -0
  590. data/vendor/rust/rust/cxxclass.rb +98 -0
  591. data/vendor/rust/rust/element.rb +81 -0
  592. data/vendor/rust/rust/enum.rb +63 -0
  593. data/vendor/rust/rust/function.rb +407 -0
  594. data/vendor/rust/rust/namespace.rb +61 -0
  595. data/vendor/rust/rust/templates/AttributeDefinition.rusttpl +17 -0
  596. data/vendor/rust/rust/templates/AttributeInitBinding.rusttpl +9 -0
  597. data/vendor/rust/rust/templates/BindingsHeader.rusttpl +24 -0
  598. data/vendor/rust/rust/templates/BindingsUnit.rusttpl +46 -0
  599. data/vendor/rust/rust/templates/CWrapperClassDefinitions.rusttpl +64 -0
  600. data/vendor/rust/rust/templates/ClassDeclarations.rusttpl +7 -0
  601. data/vendor/rust/rust/templates/ClassInitialize.rusttpl +6 -0
  602. data/vendor/rust/rust/templates/ConstructorStub.rusttpl +21 -0
  603. data/vendor/rust/rust/templates/CxxClassDefinitions.rusttpl +91 -0
  604. data/vendor/rust/rust/templates/CxxMethodStub.rusttpl +12 -0
  605. data/vendor/rust/rust/templates/CxxStandaloneClassDefinitions.rusttpl +26 -0
  606. data/vendor/rust/rust/templates/EnumDeclarations.rusttpl +3 -0
  607. data/vendor/rust/rust/templates/EnumDefinitions.rusttpl +29 -0
  608. data/vendor/rust/rust/templates/FunctionDefinition.rusttpl +9 -0
  609. data/vendor/rust/rust/templates/FunctionInitAlias.rusttpl +5 -0
  610. data/vendor/rust/rust/templates/FunctionInitBinding.rusttpl +9 -0
  611. data/vendor/rust/rust/templates/MethodInitBinding.rusttpl +9 -0
  612. data/vendor/rust/rust/templates/ModuleDeclarations.rusttpl +3 -0
  613. data/vendor/rust/rust/templates/ModuleDefinitions.rusttpl +3 -0
  614. data/vendor/rust/rust/templates/StandaloneClassDeclarations.rusttpl +7 -0
  615. data/vendor/rust/rust/templates/VariableFunctionCall.rusttpl +14 -0
  616. data/vendor/rust/rust/type.rb +98 -0
  617. data/vendor/rust/test/Makefile +4 -0
  618. data/vendor/rust/test/constants.rb +36 -0
  619. data/vendor/rust/test/cppclass.cc +45 -0
  620. data/vendor/rust/test/cppclass.hh +67 -0
  621. data/vendor/rust/test/cppclass.rb +59 -0
  622. data/vendor/rust/test/cwrapper.c +74 -0
  623. data/vendor/rust/test/cwrapper.h +41 -0
  624. data/vendor/rust/test/cwrapper.rb +56 -0
  625. data/vendor/rust/test/dummyclass.hh +31 -0
  626. data/vendor/rust/test/lib/extension-test.rb +98 -0
  627. data/vendor/rust/test/operators.cc +41 -0
  628. data/vendor/rust/test/operators.hh +39 -0
  629. data/vendor/rust/test/operators.rb +39 -0
  630. data/vendor/rust/test/test-constants.rb +43 -0
  631. data/vendor/rust/test/test-cppclass.rb +82 -0
  632. data/vendor/rust/test/test-cwrapper.rb +80 -0
  633. data/vendor/rust/test/test-operators.rb +42 -0
  634. metadata +826 -0
@@ -0,0 +1,1681 @@
1
+ /*
2
+ * Main authors:
3
+ * Christian Schulte <schulte@gecode.org>
4
+ * Guido Tack <tack@gecode.org>
5
+ *
6
+ * Copyright:
7
+ * Christian Schulte, 2002
8
+ * Guido Tack, 2003
9
+ *
10
+ * Bugfixes provided by:
11
+ * Alexander Samoilov <alexander_samoilov@yahoo.com>
12
+ *
13
+ * Last modified:
14
+ * $Date: 2006-10-25 13:51:24 +0200 (Wed, 25 Oct 2006) $ by $Author: schulte $
15
+ * $Revision: 3787 $
16
+ *
17
+ * This file is part of Gecode, the generic constraint
18
+ * development environment:
19
+ * http://www.gecode.org
20
+ *
21
+ * See the file "LICENSE" for information on usage and
22
+ * redistribution of this file, and for a
23
+ * DISCLAIMER OF ALL WARRANTIES.
24
+ *
25
+ */
26
+
27
+ namespace Gecode {
28
+
29
+ /**
30
+ * \defgroup TaskVarMEPC Generic modification events and propagation conditions
31
+ *
32
+ * Predefined modification events must be taken into account
33
+ * by variable types.
34
+ * \ingroup TaskVar
35
+ */
36
+ //@{
37
+ /// Type for modification events
38
+ typedef int ModEvent;
39
+
40
+ /// Generic modification event: failed variable
41
+ const ModEvent ME_GEN_FAILED = -1;
42
+ /// Generic modification event: no modification
43
+ const ModEvent ME_GEN_NONE = 0;
44
+ /// Generic modification event: variable is assigned a value
45
+ const ModEvent ME_GEN_ASSIGNED = 1;
46
+ /// Generic modification event: maximal modification event
47
+ const ModEvent ME_GEN_MAX = 15;
48
+
49
+ /// Type for propagation conditions
50
+ typedef int PropCond;
51
+ /// Propagation condition for an assigned variable
52
+ const PropCond PC_GEN_ASSIGNED = 0;
53
+ /// Propagation conditions must be between 0 and 15
54
+ const PropCond PC_GEN_MAX = 15;
55
+ //@}
56
+
57
+
58
+ /**
59
+ * \brief %Variable type identifiers
60
+ *
61
+ * Each variable type must have a unique variable type identifier. The
62
+ * kernel supports at most eight different variable type identifiers.
63
+ *
64
+ * If you want to add your own variable type, you have to make sure that
65
+ * file is created in the subdirectory vti. The names of the file defines
66
+ * the name of the variable type identifier (for example, if the name of
67
+ * the file is INT, it defines the identifier VTI_INT).
68
+ * \ingroup TaskVar
69
+ */
70
+ enum VarTypeId {
71
+ #include "gecode/vti.icc"
72
+ VTI_LAST, ///< Maximal variable type identifier plus one
73
+ VTI_NOIDX = 0 ///< Used for variables without indexing structure
74
+ };
75
+
76
+
77
+ /*
78
+ * These are the classes of interest
79
+ *
80
+ */
81
+ class Actor;
82
+ class Propagator;
83
+ class Space;
84
+ template <VarTypeId VTI, PropCond PC, class MED> class Variable;
85
+
86
+
87
+ /*
88
+ * Variables
89
+ *
90
+ */
91
+
92
+ /**
93
+ * \brief Base-class for variable implementations
94
+ *
95
+ * Serves as base-class that can be used without having to know any
96
+ * template arguments.
97
+ * \ingroup TaskVar
98
+ */
99
+ class VarBase {};
100
+
101
+ /**
102
+ * \brief Base-class for variable type processor
103
+ *
104
+ * Serves as base-class that can be used without having to know any
105
+ * template arguments.
106
+ * \ingroup TaskVar
107
+ */
108
+ class VarTypeProcessorBase {
109
+ public:
110
+ /// Process modified variables linked from \a x
111
+ virtual void process(Space* home, VarBase* x) = 0;
112
+ /**
113
+ * \brief Update copied variables linked from \a x
114
+ *
115
+ * The argument \a sub gives the array where subscriptions are
116
+ * to be stored.
117
+ */
118
+ virtual void update(VarBase* x, Propagator**& sub) = 0;
119
+ /**
120
+ * \brief Dispose variables
121
+ *
122
+ * If needed for the variable type, dispose a list of
123
+ * variables, with \a x being the first variable on the list.
124
+ */
125
+ virtual void dispose(Space* home, VarBase* x) = 0;
126
+ /// Destructor (not really used)
127
+ GECODE_KERNEL_EXPORT virtual ~VarTypeProcessorBase(void);
128
+ };
129
+
130
+ /**
131
+ * \brief %Variable type processor
132
+ *
133
+ * Base class for variable type processor for variable type index \a VTI
134
+ * and maximum propagation condition \a PC.
135
+ * \ingroup TaskVar
136
+ */
137
+ template <VarTypeId VTI, PropCond PC, class MED>
138
+ class VarTypeProcessor : public VarTypeProcessorBase {
139
+ public:
140
+ /// Constructor (registers processor with kernel)
141
+ VarTypeProcessor(void);
142
+ /**
143
+ * \brief Update copied variables linked from \a x
144
+ *
145
+ * The argument \a sub gives the array where subscriptions are
146
+ * to be stored.
147
+ */
148
+ virtual void update(VarBase* x, Propagator**& sub);
149
+ /**
150
+ * \brief Dispose variables
151
+ *
152
+ * If needed for the variable type, dispose a list of
153
+ * variables, with \a x being the first variable on the list.
154
+ */
155
+ virtual void dispose(Space* home, VarBase* x);
156
+ };
157
+
158
+ /**
159
+ * \brief Propagator modification events
160
+ *
161
+ * Propagator modification events are used by propagators. A
162
+ * propagator stores a modification event for each variable type.
163
+ * They can be accessed through a variable or a view from a given
164
+ * propagator. They can be constructed from a given modevent by
165
+ * a variable or view.
166
+ * \ingroup TaskActor
167
+ */
168
+ typedef int PropModEvent;
169
+
170
+
171
+ /**
172
+ * \brief Base-class for variable implementations
173
+ *
174
+ * Implements variable implementation for variable type identifier
175
+ * \a VTI and largest possible propagation condition \a PC.
176
+ * \ingroup TaskVar
177
+ */
178
+ template <VarTypeId VTI, PropCond PC, class MED>
179
+ class Variable : public VarBase {
180
+ friend class Space;
181
+ friend class Propagator;
182
+ friend class VarTypeProcessor<VTI,PC,MED>;
183
+ private:
184
+ Variable* _next; ///< Either next modified or copied variable
185
+ union {
186
+ /**
187
+ * \brief Combines the number of free entries with modification events
188
+ *
189
+ * The least four bits are reserved for the modification events, the
190
+ * remaining 28 bits are for the number of free entries.
191
+ *
192
+ */
193
+ unsigned int free_me;
194
+ /// Store the forwarding pointer during copying
195
+ Variable* fwd;
196
+ } u;
197
+ Propagator** idx[PC+2]; ///< Stores where entries start (idx[pc]}
198
+
199
+ /// Manage number of free entries internally
200
+ unsigned int free(void) const;
201
+ /// Manage number of free entries internally
202
+ void free(unsigned int n);
203
+ /// Manage number of free entries internally
204
+ void free_inc(void);
205
+ /// Manage number of free entries internally
206
+ void free_dec(void);
207
+
208
+ /**
209
+ * \brief Update copied variable \a x
210
+ *
211
+ * The argument \a sub gives the array where subscriptions are
212
+ * to be stored.
213
+ */
214
+ void update(Variable* x, Propagator**& sub);
215
+
216
+ /// Resize subscription array
217
+ void resize(Space* home);
218
+
219
+ public:
220
+ /// Creation
221
+ Variable(Space* home);
222
+
223
+ /// \name Dependencies
224
+ //@{
225
+ /** \brief Subscribe propagator \a p with propagation condition \a pc to variable
226
+ *
227
+ * In case \a process is false, the propagator is just subscribed but
228
+ * not processed for execution (this must be used when creating
229
+ * subscriptions during propagation).
230
+ *
231
+ * In case the variable is assigned (that is, \a assigned is
232
+ * true), the subscribing propagator is processed for execution.
233
+ * Otherwise, the propagator subscribes and is processed for execution
234
+ * with modification event \a me provided that \a pc is different
235
+ * from \a PC_GEN_ASSIGNED.
236
+ */
237
+ void subscribe(Space* home, Propagator* p, PropCond pc,
238
+ bool assigned, ModEvent me, bool process);
239
+ /// Cancel subscription of propagator \a p with propagation condition \a pc
240
+ void cancel(Space* home, Propagator* p, PropCond pc);
241
+ /// Return degree (number of subscribed propagators)
242
+ unsigned int degree(void) const;
243
+ /// Notify that variable implementation has been modified with modification event \a me
244
+ void notify(Space* home, ModEvent me);
245
+ /// Notify that variable implementation has been assigned (only if variable has single modification event)
246
+ void notify(Space* home);
247
+ //@}
248
+
249
+ /// \name Processing modified variables
250
+ //@{
251
+ /// Check whether variable has been modified during propagation
252
+ bool modified(void) const;
253
+ //@}
254
+
255
+ /// \name Cloning variables
256
+ //@{
257
+ /// Constructor for cloning
258
+ Variable(Space* home, bool share, Variable& x);
259
+ /// Is variable already copied
260
+ bool copied(void) const;
261
+ /// Use forward pointer if variable already copied
262
+ Variable* forward(void) const;
263
+ //@}
264
+
265
+ /// \name Propagator modification events
266
+ //@{
267
+ /// Return modification event for variable from propagator \a p
268
+ static ModEvent pme(const Propagator* p);
269
+ /// Translate modification event \a me into propagator modification event
270
+ static PropModEvent pme(ModEvent me);
271
+ /// Combine modifications events \a me1 and \a me2
272
+ static ModEvent combine(ModEvent me1, ModEvent me2);
273
+ //@}
274
+
275
+ /// \name Processing modified variables
276
+ //@{
277
+ /// Return next modified variable and reset (during processing)
278
+ Variable* next(void);
279
+ /// Return current modification event of variable
280
+ ModEvent modevent(void) const;
281
+ /// Set modification event to \a me
282
+ void modevent(ModEvent me);
283
+ /// Process subscribed propagators
284
+ void process(Space* home, PropCond pc1, PropCond pc2, ModEvent me);
285
+ /// Process subscribed propagators for assigned variable
286
+ void process(Space* home);
287
+ //@}
288
+
289
+ /// \name Memory management
290
+ //@{
291
+ /// Allocate memory from space
292
+ static void* operator new(size_t,Space*);
293
+ /// Return memory to space
294
+ static void operator delete(void*,Space*);
295
+ /// Needed for exceptions
296
+ static void operator delete(void*);
297
+ //@}
298
+ };
299
+
300
+
301
+
302
+
303
+ /**
304
+ * \brief Status of constraint propagation and branching commit
305
+ * \ingroup TaskActor
306
+ */
307
+ enum ExecStatus {
308
+ ES_FAILED = -1, ///< Execution has resulted in failure
309
+ ES_NOFIX = 0, ///< Propagation has not computed fixpoint
310
+ ES_OK = 0, ///< Execution is okay
311
+ ES_FIX = 1, ///< Propagation has computed fixpoint
312
+ ES_SUBSUMED = 2, ///< %Propagator is subsumed (entailed)
313
+ __ES_FIX_PARTIAL = 3, ///< Internal: do not use
314
+ __ES_NOFIX_PARTIAL = 4 ///< Internal: do not use
315
+ };
316
+
317
+ /**
318
+ * \brief Classification of propagation cost
319
+ * \ingroup TaskActor
320
+ */
321
+ enum PropCost {
322
+ PC_CRAZY_LO = 0, ///< Exponential complexity, cheap
323
+ PC_CRAZY_HI = 0, ///< Exponential complexity, expensive
324
+ PC_CUBIC_LO = 1, ///< Cubic complexity, cheap
325
+ PC_CUBIC_HI = 1, ///< Cubic complexity, expensive
326
+ PC_QUADRATIC_LO = 2, ///< Quadratic complexity, cheap
327
+ PC_QUADRATIC_HI = 2, ///< Quadratic complexity, expensive
328
+ PC_LINEAR_HI = 3, ///< Linear complexity, expensive
329
+ PC_LINEAR_LO = 4, ///< Linear complexity, cheap
330
+ PC_TERNARY_HI = 5, ///< Three variables, expensive
331
+ PC_BINARY_HI = 6, ///< Two variables, expensive
332
+ PC_TERNARY_LO = 6, ///< Three variables, cheap
333
+ PC_BINARY_LO = 7, ///< Two variables, cheap
334
+ PC_UNARY_LO = 7, ///< Only single variable, cheap
335
+ PC_UNARY_HI = 7, ///< Only single variable, expensive
336
+ PC_MAX = 7 ///< Maximal cost value
337
+ };
338
+
339
+ /**
340
+ * \brief Double-linked list for actors
341
+ *
342
+ * Used to maintain which actors belong to a space and also
343
+ * (for propagators) to organize actors in the queue of
344
+ * waiting propagators.
345
+ */
346
+ class ActorLink {
347
+ friend class Actor;
348
+ friend class Space;
349
+ template <VarTypeId VTI, PropCond PC, class MED> friend class Variable;
350
+ private:
351
+ ActorLink* _next; ActorLink* _prev;
352
+ public:
353
+ //@{
354
+ /// Routines for double-linked list
355
+ ActorLink* prev(void) const; void prev(ActorLink*);
356
+ ActorLink* next(void) const; void next(ActorLink*);
357
+ //@}
358
+
359
+
360
+ /// Initialize links (self-linked)
361
+ void init(void);
362
+ /// Remove from predecessor and successor
363
+ void unlink(void);
364
+ /// Insert \a al directly after this
365
+ void head(ActorLink* al);
366
+ /// Insert \a al directly before this
367
+ void tail(ActorLink* al);
368
+ };
369
+
370
+
371
+ /**
372
+ * \brief Double-linked list for deleting actors
373
+ *
374
+ * Used for actors that must be deleted (forced deletion) when a space
375
+ * is deleted (even if the space is failed).
376
+ *
377
+ * The reason why it is not conjoined with ActorLink is that the array
378
+ * of propagator queues just need the normal linkage, but not the linkage
379
+ * for deletion.
380
+ */
381
+ class ActorDeleteLink : public ActorLink {
382
+ friend class Actor;
383
+ friend class Space;
384
+ template <VarTypeId VTI, PropCond PC, class MED> friend class Variable;
385
+ private:
386
+ ActorDeleteLink* _next_d; ActorDeleteLink* _prev_d;
387
+ public:
388
+ ActorDeleteLink* next_delete(void) const;
389
+ void next_delete(ActorDeleteLink*);
390
+ ActorDeleteLink* prev_delete(void) const;
391
+ void prev_delete(ActorDeleteLink*);
392
+
393
+ /// Initialize links (self-linked)
394
+ void init_delete(void);
395
+ void unlink_delete(void);
396
+ void insert_delete(ActorDeleteLink*,bool);
397
+ };
398
+
399
+
400
+
401
+ /**
402
+ * \brief Base-class for both propagators and branchings
403
+ * \ingroup TaskActor
404
+ */
405
+ class Actor : private ActorDeleteLink {
406
+ friend class Space;
407
+ template <VarTypeId VTI, PropCond PC, class MED> friend class Variable;
408
+ public:
409
+ /// Create copy
410
+ virtual Actor* copy(Space*,bool) = 0;
411
+ /// Delete actor and return its size
412
+ GECODE_KERNEL_EXPORT
413
+ virtual size_t dispose(Space* home);
414
+
415
+ /// \name Memory management
416
+ //@{
417
+ /// Flush cache datastructures
418
+ GECODE_KERNEL_EXPORT virtual void flush(void);
419
+ /// Report size occupied by cached datastructures
420
+ GECODE_KERNEL_EXPORT virtual size_t cached(void) const;
421
+ /// Allocate memory from space
422
+ static void* operator new(size_t s, Space* home);
423
+ /// No-op for exceptions
424
+ static void operator delete(void* p, Space* home);
425
+ private:
426
+ #ifndef __GNUC__
427
+ /// Not used (uses dispose instead)
428
+ static void operator delete(void* p, size_t s);
429
+ #endif
430
+ /// Not used
431
+ static void* operator new(size_t s);
432
+ /// Destruct: unlink, dispose, and reclaim memory
433
+ void destruct(Space* home);
434
+ //@}
435
+ #ifdef __GNUC__
436
+ public:
437
+ /// To avoid warnings from GCC
438
+ virtual ~Actor(void) {}
439
+ /// Not used (uses dispose instead)
440
+ static void operator delete(void* p, size_t s);
441
+ #endif
442
+ };
443
+
444
+
445
+
446
+ /**
447
+ * \brief Base-class for propagators
448
+ * \ingroup TaskActor
449
+ */
450
+ class Propagator : public Actor {
451
+ friend class Space;
452
+ template <VarTypeId VTI, PropCond PC, class MED> friend class Variable;
453
+ private:
454
+ PropModEvent pme;
455
+ protected:
456
+ /**
457
+ * \brief Constructor for creation
458
+ *
459
+ * Force deletion, if \a fd is true
460
+ */
461
+ Propagator(Space* home, bool fd=false);
462
+ /// Constructor for cloning \a p
463
+ Propagator(Space* home, bool share, Propagator& p);
464
+
465
+ /// \name Partial fixpoints
466
+ //@{
467
+ /**
468
+ * \brief %Propagator has computed partial fixpoint
469
+ *
470
+ * %Set propagator modification events after processing of
471
+ * variables to \a pme.
472
+ * \warning Has a side-effect on the propagator. Overwrites
473
+ * the propagator modification events of a propagator.
474
+ * Use only directly with returning from propagation.
475
+ * \ingroup TaskActor
476
+ */
477
+ ExecStatus ES_FIX_PARTIAL(PropModEvent pme);
478
+ /**
479
+ * \brief %Propagator has not computed partial fixpoint
480
+ *
481
+ * %Set propagator modification events before processing of
482
+ * variables to \a pme.
483
+ * \warning Has a side-effect on the propagator. Overwrites
484
+ * the propagator modification events of a propagator.
485
+ * Use only directly with returning from propagation.
486
+ * \ingroup TaskActor
487
+ */
488
+ ExecStatus ES_NOFIX_PARTIAL(PropModEvent pme);
489
+ //@}
490
+ public:
491
+ /// \name Propagation
492
+ //@{
493
+ /// Propagation function
494
+ virtual ExecStatus propagate(Space*) = 0;
495
+ /// Cost function
496
+ virtual PropCost cost(void) const = 0;
497
+ //@}
498
+ };
499
+
500
+
501
+
502
+ /*
503
+ * Branchings
504
+ *
505
+ */
506
+
507
+ class Branching;
508
+
509
+ /**
510
+ * \brief Branch description for batch recomputation
511
+ *
512
+ * Must be refined by inheritance such that the information stored
513
+ * inside a branching description is sufficient to redo a tell
514
+ * performed by a particular branching.
515
+ *
516
+ * \ingroup TaskActor
517
+ */
518
+ class BranchingDesc {
519
+ friend class Space;
520
+ private:
521
+ const unsigned int id; ///< Identity to match creating branching
522
+ const unsigned int alt; ///< Number of alternatives
523
+ protected:
524
+ /// Initialize for particular branching \a b and alternatives \a a
525
+ BranchingDesc(const Branching* b, const unsigned int a);
526
+ public:
527
+ /// Destructor
528
+ GECODE_KERNEL_EXPORT virtual ~BranchingDesc(void);
529
+
530
+ /// Return number of alternatives
531
+ unsigned int alternatives(void) const;
532
+
533
+ /// Report size occupied by branching description
534
+ virtual size_t size(void) const = 0;
535
+ /// Allocate memory from heap
536
+ static void* operator new(size_t);
537
+ /// Return memory to heap
538
+ static void operator delete(void*);
539
+ };
540
+
541
+ /**
542
+ * \brief Base-class for branchings
543
+ *
544
+ * Note that branchings cannot be created inside a propagator
545
+ * (no idea why one would like to that anyway). If you do that
546
+ * the system will explode in a truly interesting way.
547
+ *
548
+ * \ingroup TaskActor
549
+ */
550
+ class Branching : public Actor {
551
+ friend class Space;
552
+ friend class BranchingDesc;
553
+ private:
554
+ unsigned int id; ///< Unique identity (to match to branching descriptions)
555
+ protected:
556
+ /// Constructor for creation, force disposal if \a fd is true
557
+ Branching(Space* home, bool fd=false);
558
+ /// Constructor for cloning \a b
559
+ Branching(Space* home, bool share, Branching& b);
560
+
561
+ public:
562
+ /// \name Branching
563
+ //@{
564
+ /**
565
+ * \brief Check status of branching, return true if alternatives left
566
+ *
567
+ * This method is called when Space::status is called, it determines
568
+ * whether to continue branching with this branching or move on to
569
+ * the (possibly) next branching.
570
+ *
571
+ */
572
+ virtual bool status(const Space* home) const = 0;
573
+ /**
574
+ * \brief Return branching description
575
+ *
576
+ * Note that this method can rely on the fact that it is called
577
+ * immediately after a previous call to status. Hence, it is safe
578
+ * to remember computation from status in order to speed up
579
+ * description.
580
+ *
581
+ */
582
+ virtual const BranchingDesc* description(const Space* home) const = 0;
583
+ /**
584
+ * \brief Commit for branching description \a d and alternative \a a
585
+ *
586
+ * The current branching in the space \a home performs a commit from
587
+ * the information provided by the branching description \a d
588
+ * and the alternative \a a.
589
+ */
590
+ virtual ExecStatus commit(Space* home, const BranchingDesc* d,
591
+ unsigned int a) = 0;
592
+ //@}
593
+ };
594
+
595
+
596
+
597
+ /**
598
+ * \brief %Space status
599
+ * \ingroup TaskSearch
600
+ */
601
+ enum SpaceStatus {
602
+ SS_FAILED, ///< %Space is failed
603
+ SS_SOLVED, ///< %Space is solved (no branching left)
604
+ SS_BRANCH ///< %Space must be branched (at least one branching left)
605
+ };
606
+
607
+ /**
608
+ * \brief Computation spaces
609
+ */
610
+ class Space {
611
+ friend class Propagator;
612
+ friend class Branching;
613
+ template <VarTypeId VTI, PropCond PC, class MED> friend class Variable;
614
+ template <VarTypeId VTI, PropCond PC, class MED> friend class VarTypeProcessor;
615
+ private:
616
+ MemoryManager mm; ///< Performs memory management for space
617
+
618
+ /**
619
+ * \name Processing variables
620
+ */
621
+ //@{
622
+ /// Registered variable type processors
623
+ GECODE_KERNEL_EXPORT
624
+ static VarTypeProcessorBase* vtp[VTI_LAST];
625
+ /// Array of all modified or copied variables (entry points)
626
+ VarBase* vars[VTI_LAST];
627
+ /// Array of lists of variables that need deletion
628
+ VarBase* vars_dispose[VTI_LAST];
629
+ /// To keep variables during copying without index structure
630
+ VarBase* vars_noidx;
631
+ /// Process all modified variables by delegating to registered processors
632
+ void process(void);
633
+ //@}
634
+
635
+ /**
636
+ * \name Pool of waiting propagators
637
+ */
638
+ //@{
639
+ /// Waiting propagators according to cost
640
+ ActorLink pool[PC_MAX+1];
641
+ /// Next cost level to check
642
+ int pool_next;
643
+ /// Put propagator \a p to pool
644
+ void pool_put(Propagator* p);
645
+ /// Get propagator \a p from pool
646
+ bool pool_get(Propagator*& p);
647
+ //@}
648
+
649
+ /**
650
+ * \brief Doubly linked list of all actors
651
+ *
652
+ * Propagators are stored at the beginning, branchings (if any) at
653
+ * the end.
654
+ */
655
+ ActorDeleteLink a_actors;
656
+ /**
657
+ * \brief Points to the first branching to be used for status
658
+ *
659
+ * If equal to &a_actors, no branching does exist.
660
+ *
661
+ * If it is NULL, the space is failed.
662
+ *
663
+ */
664
+ Branching* b_status;
665
+ /**
666
+ * \brief Points to the first branching to be used for commit
667
+ *
668
+ * Note that \a b_commit can point to an earlier branching
669
+ * than \a b_status. This reflects the fact that the earlier
670
+ * branching is already done (that is, status on that branching
671
+ * returns false) but there might be still branching descriptions
672
+ * referring to the earlier branching.
673
+ *
674
+ * If equal to &a_actors, no branching does exist.
675
+ *
676
+ */
677
+ Branching* b_commit;
678
+ /// Id of next branching to be created
679
+ unsigned int branch_id;
680
+
681
+ /**
682
+ * \brief Number of subscriptions
683
+ *
684
+ * This number includes both the number of subscriptions and
685
+ * one free slot and hence can be considered as a conservative
686
+ * approximation of the real number of subscriptions. The number
687
+ * becomes more accurate after cloning a space.
688
+ *
689
+ */
690
+ unsigned int n_sub;
691
+ /**
692
+ * \brief Memory area used for storing subscriptions
693
+ *
694
+ * This area is only used when a space is created by cloning, otherwise
695
+ * subscriptions are stored in space-allocated memory.
696
+ *
697
+ */
698
+ Propagator** sub;
699
+ /// Used for default arguments
700
+ GECODE_KERNEL_EXPORT static unsigned long int unused_uli;
701
+
702
+ /// Perform propagation, return number of propagation steps
703
+ GECODE_KERNEL_EXPORT unsigned long int propagate(void);
704
+
705
+ /// Add new propagator \a p to space (force disposal, if \a fd is true)
706
+ void propagator(Propagator* p, bool fd);
707
+ /// Readd propagator \a p (after performing propagation)
708
+ void propagator(Propagator*);
709
+ /// Add new branching \a b to space (force disposal, if \a fd is true)
710
+ void branching(Branching* b, bool fd);
711
+
712
+ /**
713
+ * \name Processing propagators
714
+ */
715
+ //@{
716
+ /// Process propagator \a p with modification event \a me
717
+ template <VarTypeId VTI, class MED>
718
+ void process(Propagator* p, ModEvent me);
719
+ /// Process propagator \a p with modification event ME_GEN_ASSIGNED
720
+ template <VarTypeId VTI, class MED>
721
+ void process(Propagator* p);
722
+ //@}
723
+
724
+
725
+ public:
726
+ /**
727
+ * \brief Default constructor
728
+ * \ingroup TaskIntScript
729
+ */
730
+ GECODE_KERNEL_EXPORT Space(void);
731
+ /**
732
+ * \brief Destructor
733
+ * \ingroup TaskIntScript
734
+ */
735
+ GECODE_KERNEL_EXPORT virtual ~Space(void);
736
+ /**
737
+ * \brief Constructor for cloning
738
+ *
739
+ * Must copy and update all data structures (such as variables
740
+ * and variable arrays) required by the subclass of Space.
741
+ *
742
+ * If \a share is true, share all data structures among copies.
743
+ * Otherwise, make independent copies.
744
+ * \ingroup TaskIntScript
745
+ */
746
+ GECODE_KERNEL_EXPORT Space(bool share, Space& s);
747
+ /**
748
+ * \brief Copying member function
749
+ *
750
+ * Must create a new object using the constructor for cloning.
751
+ * \ingroup TaskIntScript
752
+ */
753
+ virtual Space* copy(bool share) = 0;
754
+ /**
755
+ * \brief Allocate memory from heap for new space
756
+ * \ingroup TaskIntScript
757
+ */
758
+ static void* operator new(size_t);
759
+ /**
760
+ * \brief Free memory allocated from heap
761
+ * \ingroup TaskIntScript
762
+ */
763
+ static void operator delete(void*);
764
+
765
+
766
+
767
+
768
+ /*
769
+ * Member functions for search engines
770
+ *
771
+ */
772
+
773
+ /**
774
+ * \brief Query space status
775
+ *
776
+ * Propagates the space until fixpoint or failure and
777
+ * increments \a pn by the number of propagator executions.
778
+ * - if the space is failed, SpaceStatus::SS_FAILED is returned.
779
+ * - if the space is not failed but the space has no branching left,
780
+ * SpaceStatus::SS_SOLVED is returned.
781
+ * - otherwise, SpaceStatus::SS_BRANCH is returned.
782
+ * \ingroup TaskSearch
783
+ */
784
+ SpaceStatus status(unsigned long int& pn=unused_uli);
785
+
786
+ /**
787
+ * \brief Create new branching description for current branching
788
+ *
789
+ * This member function can only be called after the member function
790
+ * Space::status on the same space has been called and in between
791
+ * no non-const member function has been called on this space.
792
+ *
793
+ * Note that the above invariant obly pertains to calls of member
794
+ * functions of the same space. If the invariant is violated, the
795
+ * system is likely to crash (hopefully it does). In particular, if
796
+ * applied to a space with no current branching, the system will
797
+ * crash.
798
+ *
799
+ * \ingroup TaskSearch
800
+ */
801
+ const BranchingDesc* description(void) const;
802
+
803
+ /**
804
+ * \brief Clone space
805
+ *
806
+ * Propagates the space until fixpoint and increments \a pn by the
807
+ * number of propagator executions. If propagation results in
808
+ * a failed space, an exception of type SpaceFailed is thrown.
809
+ *
810
+ * Otherwise, a clone of the space is returned. If \a shared is true,
811
+ * sharable datastructures are shared among the clone and the original
812
+ * space. If \a shared is false, independent copies of the shared
813
+ * datastructures must be created. This means that a clone with no
814
+ * sharing can be used in a different thread without any interaction
815
+ * with the original space.
816
+ *
817
+ * \ingroup TaskSearch
818
+ */
819
+ GECODE_KERNEL_EXPORT
820
+ Space* clone(bool share=true, unsigned long int& pn=unused_uli);
821
+
822
+ /**
823
+ * \brief Commit branching description \a d and for alternative \a a
824
+ *
825
+ * The current branching in the space performs a commit from
826
+ * the information provided by the branching description \a d
827
+ * and the alternative \a a.
828
+ *
829
+ * Note that no propagation is perfomed (to support batch
830
+ * recomputation), in order to perform propagation the member
831
+ * function status must be used.
832
+ *
833
+ * Committing with branching descriptions must be carried
834
+ * out in the same order as the branch descriptions have been
835
+ * obtained by the member function Space::description().
836
+ *
837
+ * It is perfectly okay to add constraints interleaved with
838
+ * branching descriptions (provided they are in the right order).
839
+ * However, if propagation is performed by calling the member
840
+ * function status and then new branching descriptions are
841
+ * computed, these branching descriptions are different.
842
+ *
843
+ * Committing throws the following exceptions:
844
+ * - SpaceNoBranching, if the space has no current branching (it is
845
+ * already solved).
846
+ * - SpaceIllegalAlternative, if \a a is not smaller than the number
847
+ * of alternatives supported by the branching description \a d.
848
+ *
849
+ * \ingroup TaskSearch
850
+ */
851
+ GECODE_KERNEL_EXPORT
852
+ void commit(const BranchingDesc* d, unsigned int a);
853
+
854
+ /**
855
+ * \brief Flush cache datastructures in actors
856
+ *
857
+ * Flushes caches of actors in the space. This is useful to free
858
+ * memory (in particular when considering a space to be stored
859
+ * for later use such as during search). Even better is to make a
860
+ * clone of the space.
861
+ *
862
+ * \ingroup TaskSearch
863
+ */
864
+ GECODE_KERNEL_EXPORT
865
+ void flush(void);
866
+
867
+
868
+ /*
869
+ * Status checking and failing outside actors
870
+ *
871
+ */
872
+
873
+ /**
874
+ * \brief Fail space
875
+ *
876
+ * This is useful for failing outside of actors. Never use inside
877
+ * a propagate or commit member function. The system will crash!
878
+ * \ingroup TaskActor
879
+ */
880
+ void fail(void);
881
+ /**
882
+ * \brief Check whether space is failed
883
+ *
884
+ * Note that this does not perform propagation. This is useful
885
+ * for posting actors: only if a space is not yet failed, new
886
+ * actors are allowed to be created.
887
+ * \ingroup TaskActor
888
+ */
889
+ bool failed(void) const;
890
+ /**
891
+ * \brief Return number of propagators
892
+ *
893
+ * Note that this function takes linear time in the number of
894
+ * propagators. The number is only accurate when the space is
895
+ * stable (that is, at fixpoint and all propagation is done).
896
+ *
897
+ * Throws an exception of type SpaceFailed, if the space is failed.
898
+ */
899
+ GECODE_KERNEL_EXPORT
900
+ unsigned int propagators(void) const;
901
+ /**
902
+ * \brief Return number of branchings
903
+ *
904
+ * Note that this function takes linear time in the number of branchings.
905
+ *
906
+ * Throws an exception of type SpaceFailed, if the space is failed.
907
+ */
908
+ GECODE_KERNEL_EXPORT
909
+ unsigned int branchings(void) const;
910
+
911
+ /**
912
+ * \defgroup FuncMemSpace Space-memory management
913
+ * \ingroup FuncMem
914
+ */
915
+ //@{
916
+ /// Allocate memory on space heap
917
+ void* alloc(size_t);
918
+ /// Attempt to reuse memory previously allocated with alloc
919
+ void reuse(void*,size_t);
920
+ /// Allocate from freelist-managed memory
921
+ template <size_t> void* fl_alloc(void);
922
+ /**
923
+ * \brief Return freelist-managed memory to freelist
924
+ *
925
+ * The first list element to be retuned is \a f, the last is \a l.
926
+ */
927
+ template <size_t> void fl_dispose(FreeList* f, FreeList* l);
928
+ /**
929
+ * \brief Return how much heap memory is allocated by this space
930
+ *
931
+ * Note that is excludes the memory for the space object itself.
932
+ */
933
+ size_t allocated(void) const;
934
+ /// Return how much memory is used by caches for actors
935
+ GECODE_KERNEL_EXPORT size_t cached(void) const;
936
+ /// Return list of variables that need deletion
937
+ template <VarTypeId VTI> VarBase* varsDisposeList(void);
938
+ /// Set list of variables that need deletion
939
+ template <VarTypeId VTI> void varsDisposeList(VarBase* v);
940
+ //@}
941
+ };
942
+
943
+
944
+
945
+
946
+ /***
947
+ *** MEMORY MANAGEMENT
948
+ ***
949
+ ***/
950
+
951
+ /*
952
+ * Heap allocated: Space, BranchDesc
953
+ *
954
+ */
955
+
956
+ forceinline void*
957
+ Space::operator new(size_t s) {
958
+ return Memory::malloc(s);
959
+ }
960
+ forceinline void
961
+ Space::operator delete(void* p) {
962
+ Memory::free(p);
963
+ }
964
+
965
+ forceinline void
966
+ BranchingDesc::operator delete(void* p) {
967
+ Memory::free(p);
968
+ }
969
+ forceinline void*
970
+ BranchingDesc::operator new(size_t s) {
971
+ return Memory::malloc(s);
972
+ }
973
+
974
+ /*
975
+ * Space allocation: general space heaps and free lists
976
+ *
977
+ */
978
+
979
+ forceinline void*
980
+ Space::alloc(size_t s) {
981
+ return mm.alloc(s);
982
+ }
983
+ forceinline void
984
+ Space::reuse(void* p, size_t s) {
985
+ return mm.reuse(p,s);
986
+ }
987
+
988
+ template <size_t s>
989
+ forceinline void*
990
+ Space::fl_alloc(void) {
991
+ return mm.template fl_alloc<s>();
992
+ }
993
+ template <size_t s>
994
+ forceinline void
995
+ Space::fl_dispose(FreeList* f, FreeList* l) {
996
+ mm.template fl_dispose<s>(f,l);
997
+ }
998
+
999
+ forceinline size_t
1000
+ Space::allocated(void) const {
1001
+ return mm.allocated()+n_sub*sizeof(Propagator**);
1002
+ }
1003
+
1004
+ template <VarTypeId VTI>
1005
+ forceinline VarBase*
1006
+ Space::varsDisposeList(void) {
1007
+ return vars_dispose[VTI];
1008
+ }
1009
+
1010
+ template <VarTypeId VTI>
1011
+ forceinline void
1012
+ Space::varsDisposeList(VarBase* v) {
1013
+ vars_dispose[VTI]=v;
1014
+ }
1015
+
1016
+ /*
1017
+ * Space allocated entities: Actors and Variables
1018
+ *
1019
+ */
1020
+
1021
+ forceinline void
1022
+ Actor::operator delete(void*, size_t) {}
1023
+ forceinline void
1024
+ Actor::operator delete(void*,Space*) {}
1025
+ forceinline void*
1026
+ Actor::operator new(size_t s, Space* home) {
1027
+ return home->alloc(s);
1028
+ }
1029
+
1030
+ template <VarTypeId VTI, PropCond PC, class MED>
1031
+ forceinline void
1032
+ Variable<VTI,PC,MED>::operator delete(void*) {}
1033
+ template <VarTypeId VTI, PropCond PC, class MED>
1034
+ forceinline void
1035
+ Variable<VTI,PC,MED>::operator delete(void*, Space*) {}
1036
+ template <VarTypeId VTI, PropCond PC, class MED>
1037
+ forceinline void*
1038
+ Variable<VTI,PC,MED>::operator new(size_t s, Space* home) {
1039
+ return home->alloc(s);
1040
+ }
1041
+
1042
+
1043
+
1044
+ /*
1045
+ * ActorLinks as common subclass for propagators and branchings
1046
+ *
1047
+ */
1048
+
1049
+ forceinline ActorLink*
1050
+ ActorLink::prev(void) const { return _prev; }
1051
+ forceinline ActorLink*
1052
+ ActorLink::next(void) const { return _next; }
1053
+ forceinline void
1054
+ ActorLink::prev(ActorLink* al) { _prev = al; }
1055
+ forceinline void
1056
+ ActorLink::next(ActorLink* al) { _next = al; }
1057
+
1058
+ forceinline void
1059
+ ActorLink::unlink(void) {
1060
+ ActorLink* p = _prev; ActorLink* n = _next;
1061
+ p->_next = n; n->_prev = p;
1062
+ }
1063
+ forceinline void
1064
+ ActorLink::init(void) {
1065
+ _next = this; _prev =this;
1066
+ }
1067
+ forceinline void
1068
+ ActorLink::head(ActorLink* a) {
1069
+ // Inserts al at head of link-chain (that is, after this)
1070
+ ActorLink* n = _next;
1071
+ this->_next = a; a->_prev = this;
1072
+ a->_next = n; n->_prev = a;
1073
+ }
1074
+ forceinline void
1075
+ ActorLink::tail(ActorLink* a) {
1076
+ // Inserts al at tail of link-chain (that is, before this)
1077
+ ActorLink* p = _prev;
1078
+ a->_next = this; this->_prev = a;
1079
+ p->_next = a; a->_prev = p;
1080
+ }
1081
+
1082
+
1083
+
1084
+ forceinline ActorDeleteLink*
1085
+ ActorDeleteLink::next_delete(void) const { return _next_d; }
1086
+ forceinline ActorDeleteLink*
1087
+ ActorDeleteLink::prev_delete(void) const { return _prev_d; }
1088
+ forceinline void
1089
+ ActorDeleteLink::next_delete(ActorDeleteLink* adl) { _next_d = adl; }
1090
+ forceinline void
1091
+ ActorDeleteLink::prev_delete(ActorDeleteLink* adl) { _prev_d = adl; }
1092
+
1093
+ forceinline void
1094
+ ActorDeleteLink::unlink_delete(void) {
1095
+ ActorDeleteLink* p = _prev_d;
1096
+ ActorDeleteLink* n = _next_d;
1097
+ p->_next_d = n; n->_prev_d = p;
1098
+ }
1099
+
1100
+ forceinline void
1101
+ ActorDeleteLink::insert_delete(ActorDeleteLink* a, bool fd) {
1102
+ if (fd) {
1103
+ // Link a after this
1104
+ ActorDeleteLink* n = _next_d;
1105
+ this->_next_d = a; a->_prev_d = this;
1106
+ a->_next_d = n; n->_prev_d = a;
1107
+ } else {
1108
+ // Just link to itself
1109
+ a->_prev_d = a; a->_next_d = a;
1110
+ }
1111
+ }
1112
+
1113
+ forceinline void
1114
+ ActorDeleteLink::init_delete(void) {
1115
+ _next_d = this; _prev_d = this;
1116
+ }
1117
+
1118
+
1119
+
1120
+
1121
+ forceinline size_t
1122
+ Actor::dispose(Space*) {
1123
+ return sizeof(*this);
1124
+ }
1125
+
1126
+ forceinline void
1127
+ Actor::destruct(Space* home) {
1128
+ unlink_delete();
1129
+ size_t s = dispose(home);
1130
+ home->reuse(this,s);
1131
+ }
1132
+
1133
+
1134
+ /*
1135
+ * Spaces
1136
+ *
1137
+ */
1138
+
1139
+ forceinline const BranchingDesc*
1140
+ Space::description(void) const {
1141
+ return b_status->description(this);
1142
+ }
1143
+
1144
+ forceinline bool
1145
+ Space::failed(void) const {
1146
+ return b_status == NULL;
1147
+ }
1148
+
1149
+ /*
1150
+ * Main control for propagation and branching
1151
+ * - a space only propagates and branches if requested by
1152
+ * either a status, commit, or clone operation
1153
+ * - for all of the operations the number of propagation
1154
+ * steps performed is returned in the last (optional)
1155
+ * reference argument
1156
+ *
1157
+ */
1158
+ forceinline SpaceStatus
1159
+ Space::status(unsigned long int& pn) {
1160
+ // Perform propagation and do not continue when failed
1161
+ pn += propagate();
1162
+ if (failed())
1163
+ return SS_FAILED;
1164
+ /*
1165
+ * Find the next branching that has still alternatives left
1166
+ *
1167
+ * It is important to note that branchings reporting to have no more
1168
+ * alternatives left can not be deleted. They can not be deleted
1169
+ * as there might be branching descriptions to be used in commit
1170
+ * that refer to one of these branchings.
1171
+ *
1172
+ * A branching reporting that no more alternatives exist will eventually
1173
+ * be deleted in commit. It will be deleted if the first branching
1174
+ * description is used in commit that does not refer to this branching.
1175
+ * As we insist that branching descriptions are used in order of
1176
+ * creation, all further branching descriptions cannot refer to this
1177
+ * branching.
1178
+ *
1179
+ */
1180
+ while (b_status != &a_actors) {
1181
+ if (b_status->status(this))
1182
+ return SS_BRANCH;
1183
+ b_status = static_cast<Branching*>(b_status->next());
1184
+ }
1185
+ // No branching with alternatives left, space is solved
1186
+ return SS_SOLVED;
1187
+ }
1188
+
1189
+
1190
+ /*
1191
+ * Variables
1192
+ *
1193
+ */
1194
+
1195
+ template <VarTypeId VTI, PropCond PC, class MED>
1196
+ forceinline
1197
+ Variable<VTI,PC,MED>::Variable(Space*) :
1198
+ _next(reinterpret_cast<Variable<VTI,PC,MED>*>(1)) {
1199
+ u.free_me = 0;
1200
+ for (int i=PC+2; i--; )
1201
+ idx[i] = NULL;
1202
+ }
1203
+
1204
+
1205
+ template <VarTypeId VTI, PropCond PC, class MED>
1206
+ forceinline unsigned int
1207
+ Variable<VTI,PC,MED>::degree(void) const {
1208
+ return static_cast<unsigned int>(idx[PC+1] - idx[0]);
1209
+ }
1210
+
1211
+
1212
+
1213
+ template <VarTypeId VTI, PropCond PC, class MED>
1214
+ forceinline ModEvent
1215
+ Variable<VTI,PC,MED>::modevent(void) const {
1216
+ return u.free_me & 15;
1217
+ }
1218
+
1219
+ template <VarTypeId VTI, PropCond PC, class MED>
1220
+ forceinline void
1221
+ Variable<VTI,PC,MED>::modevent(ModEvent me) {
1222
+ u.free_me = (u.free_me & ~15) | me;
1223
+ }
1224
+ template <VarTypeId VTI, PropCond PC, class MED>
1225
+ forceinline unsigned int
1226
+ Variable<VTI,PC,MED>::free(void) const {
1227
+ return u.free_me >> 4;
1228
+ }
1229
+
1230
+ template <VarTypeId VTI, PropCond PC, class MED>
1231
+ forceinline void
1232
+ Variable<VTI,PC,MED>::free(unsigned int n) {
1233
+ u.free_me = (u.free_me & 15) | (n << 4);
1234
+ }
1235
+
1236
+ template <VarTypeId VTI, PropCond PC, class MED>
1237
+ forceinline void
1238
+ Variable<VTI,PC,MED>::free_inc(void) {
1239
+ u.free_me += (1 << 4);
1240
+ }
1241
+
1242
+ template <VarTypeId VTI, PropCond PC, class MED>
1243
+ forceinline void
1244
+ Variable<VTI,PC,MED>::free_dec(void) {
1245
+ u.free_me -= (1 << 4);
1246
+ }
1247
+
1248
+ template <VarTypeId VTI, PropCond PC, class MED>
1249
+ forceinline bool
1250
+ Variable<VTI,PC,MED>::modified(void) const {
1251
+ return _next != reinterpret_cast<Variable<VTI,PC,MED>*>(1);
1252
+ }
1253
+
1254
+
1255
+
1256
+ template <VarTypeId VTI, PropCond PC, class MED>
1257
+ forceinline Variable<VTI,PC,MED>*
1258
+ Variable<VTI,PC,MED>::next(void) {
1259
+ Variable<VTI,PC,MED>* n = _next;
1260
+ _next = reinterpret_cast<Variable<VTI,PC,MED>*>(1);
1261
+ return n;
1262
+ }
1263
+
1264
+ template <VarTypeId VTI, PropCond PC, class MED>
1265
+ forceinline bool
1266
+ Variable<VTI,PC,MED>::copied(void) const {
1267
+ return _next != reinterpret_cast<Variable<VTI,PC,MED>*>(1);
1268
+ }
1269
+
1270
+ template <VarTypeId VTI, PropCond PC, class MED>
1271
+ forceinline
1272
+ Variable<VTI,PC,MED>::Variable(Space* home, bool, Variable<VTI,PC,MED>& x)
1273
+ : _next(reinterpret_cast<Variable<VTI,PC,MED>*>(1)) {
1274
+ VarBase** reg;
1275
+ if (x.idx[0] == NULL) {
1276
+ // Variable needs no index structure
1277
+ u.free_me = 0;
1278
+ for (int i=PC+2; i--; )
1279
+ idx[i] = NULL;
1280
+ reg = &home->vars_noidx;
1281
+ } else {
1282
+ // Recover original value in copy
1283
+ u.free_me = x.u.free_me;
1284
+ reg = &home->vars[VTI];
1285
+ }
1286
+ // Set forwarding pointer
1287
+ x.u.fwd = this;
1288
+ // Register original
1289
+ x._next = static_cast<Variable<VTI,PC,MED>*>(*reg); *reg = &x;
1290
+ }
1291
+
1292
+ template <VarTypeId VTI, PropCond PC, class MED>
1293
+ forceinline Variable<VTI,PC,MED>*
1294
+ Variable<VTI,PC,MED>::forward(void) const {
1295
+ return u.fwd;
1296
+ }
1297
+
1298
+ /*
1299
+ * Propagator modification events
1300
+ *
1301
+ */
1302
+
1303
+ template <VarTypeId VTI, PropCond PC, class MED>
1304
+ forceinline ModEvent
1305
+ Variable<VTI,PC,MED>::pme(const Propagator* p) {
1306
+ return static_cast<ModEvent>((p->pme >> (VTI << 2)) & 15);
1307
+ }
1308
+
1309
+ template <VarTypeId VTI, PropCond PC, class MED>
1310
+ forceinline PropModEvent
1311
+ Variable<VTI,PC,MED>::pme(ModEvent me) {
1312
+ return static_cast<PropModEvent>(me << (VTI << 2));
1313
+ }
1314
+
1315
+ template <VarTypeId VTI, PropCond PC, class MED>
1316
+ forceinline ModEvent
1317
+ Variable<VTI,PC,MED>::combine(ModEvent me1, ModEvent me2) {
1318
+ MED med;
1319
+ return me2^med(me1,me2);
1320
+ }
1321
+
1322
+ /*
1323
+ * Propagators
1324
+ *
1325
+ */
1326
+
1327
+ forceinline void
1328
+ Space::propagator(Propagator* p, bool fd) {
1329
+ // Propagators are put at the front of the link of actors
1330
+ a_actors.head(p);
1331
+ a_actors.insert_delete(p,fd);
1332
+ }
1333
+
1334
+ forceinline void
1335
+ Space::propagator(Propagator* p) {
1336
+ a_actors.head(p);
1337
+ }
1338
+
1339
+ forceinline void
1340
+ Space::branching(Branching* b, bool fd) {
1341
+ // Propagators are put at the tail of the link of actors
1342
+ b->id = branch_id++;
1343
+ // If no branching available, make it the first one
1344
+ if (b_status == &a_actors) {
1345
+ b_status = b;
1346
+ if (b_commit == &a_actors)
1347
+ b_commit = b;
1348
+ }
1349
+ a_actors.tail(b);
1350
+ a_actors.insert_delete(b,fd);
1351
+ }
1352
+
1353
+
1354
+
1355
+ forceinline
1356
+ Propagator::Propagator(Space* home, bool fd)
1357
+ : pme(0) {
1358
+ home->propagator(this,fd);
1359
+ }
1360
+
1361
+ forceinline
1362
+ Propagator::Propagator(Space*, bool, Propagator&)
1363
+ : pme(0) {}
1364
+
1365
+
1366
+ /*
1367
+ * Branchings
1368
+ *
1369
+ */
1370
+
1371
+ forceinline
1372
+ Branching::Branching(Space* home, bool fd) {
1373
+ home->branching(this,fd);
1374
+ }
1375
+
1376
+ forceinline
1377
+ Branching::Branching(Space*, bool, Branching& b)
1378
+ : id(b.id) {}
1379
+
1380
+
1381
+
1382
+ /*
1383
+ * Branching descriptions
1384
+ *
1385
+ */
1386
+
1387
+ forceinline
1388
+ BranchingDesc::BranchingDesc(const Branching* b, const unsigned int a)
1389
+ : id(b->id), alt(a) {}
1390
+
1391
+ forceinline unsigned int
1392
+ BranchingDesc::alternatives(void) const {
1393
+ return alt;
1394
+ }
1395
+
1396
+ forceinline
1397
+ BranchingDesc::~BranchingDesc(void) {}
1398
+
1399
+
1400
+
1401
+
1402
+
1403
+ /*
1404
+ * Propagator pools
1405
+ *
1406
+ */
1407
+
1408
+ forceinline void
1409
+ Space::pool_put(Propagator* p) {
1410
+ int c = p->cost();
1411
+ pool[c].tail(p);
1412
+ if (c > pool_next)
1413
+ pool_next = c;
1414
+ }
1415
+
1416
+ forceinline void
1417
+ Space::fail(void) {
1418
+ b_status = NULL;
1419
+ }
1420
+
1421
+ template <VarTypeId VTI, class MED>
1422
+ forceinline void
1423
+ Space::process(Propagator* p) {
1424
+ // The new event is ME_GEN_ASSIGNED
1425
+ PropModEvent old_pme = p->pme;
1426
+ // Compute old modification event
1427
+ ModEvent old_me = old_pme & (ME_GEN_MAX << (VTI << 2));
1428
+ // Check whether old event is already ME_GEN_ASSIGNED
1429
+ if (old_me == (ME_GEN_ASSIGNED << (VTI << 2)))
1430
+ return;
1431
+ // Update event
1432
+ p->pme ^= old_me ^ (ME_GEN_ASSIGNED << (VTI << 2));
1433
+ // Put propagator into right queue
1434
+ p->unlink();
1435
+ pool_put(p);
1436
+ }
1437
+
1438
+ template <VarTypeId VTI, class MED>
1439
+ forceinline void
1440
+ Space::process(Propagator* p, ModEvent new_me) {
1441
+ MED med;
1442
+ PropModEvent old_pme = p->pme;
1443
+ // Compute the old modification event
1444
+ ModEvent old_me = ((old_pme >> (VTI << 2)) & ME_GEN_MAX);
1445
+ // Get the new modification event (xor-ed with the old one)
1446
+ ModEvent com_me = med(new_me,old_me);
1447
+ // Event has not changed, do not nothing
1448
+ if (com_me == 0)
1449
+ return;
1450
+ // Update modification event for propagator (use xor)
1451
+ p->pme ^= (com_me << (VTI << 2));
1452
+ // Put propagator into right queue
1453
+ p->unlink();
1454
+ pool_put(p);
1455
+ }
1456
+
1457
+ forceinline ExecStatus
1458
+ Propagator::ES_FIX_PARTIAL(PropModEvent pme) {
1459
+ this->pme = pme; return __ES_FIX_PARTIAL;
1460
+ }
1461
+
1462
+ forceinline ExecStatus
1463
+ Propagator::ES_NOFIX_PARTIAL(PropModEvent pme) {
1464
+ this->pme = pme; return __ES_NOFIX_PARTIAL;
1465
+ }
1466
+
1467
+
1468
+ /*
1469
+ * Subscribing to a variable
1470
+ *
1471
+ */
1472
+
1473
+ template <VarTypeId VTI, PropCond PC, class MED>
1474
+ forceinline void
1475
+ Variable<VTI,PC,MED>::subscribe(Space* home, Propagator* p, PropCond pc,
1476
+ bool assigned, ModEvent me, bool process) {
1477
+ if (assigned) {
1478
+ // Do not subscribe, just process the propagator
1479
+ if (process)
1480
+ home->process<VTI,MED>(p);
1481
+ } else {
1482
+ // Count one new subscription
1483
+ home->n_sub += 1;
1484
+ if (free() == 0)
1485
+ resize(home);
1486
+ free_dec();
1487
+ // Enter propagator
1488
+ --idx[0];
1489
+ for (PropCond i = 0; i < pc; i++)
1490
+ *(idx[i]) = *(--idx[i+1]);
1491
+ *idx[pc]=p;
1492
+ // Process propagator
1493
+ if (process && (pc != PC_GEN_ASSIGNED))
1494
+ home->process<VTI,MED>(p,me);
1495
+ }
1496
+ }
1497
+
1498
+ template <VarTypeId VTI, PropCond PC, class MED>
1499
+ void
1500
+ Variable<VTI,PC,MED>::resize(Space* home) {
1501
+ assert(free() == 0);
1502
+ if (idx[0] == NULL) {
1503
+ // Count the one new free entry
1504
+ home->n_sub += 1;
1505
+ // Create fresh dependency array
1506
+ free(4);
1507
+ Propagator** prop = reinterpret_cast<Propagator**>
1508
+ (home->alloc(4*sizeof(Propagator*))) + 4;
1509
+ for (PropCond i = PC+2; i--; )
1510
+ idx[i] = prop;
1511
+ } else {
1512
+ // Resize dependency array
1513
+ int n = static_cast<int>(idx[PC+1] - idx[0]);
1514
+ Propagator** prop = reinterpret_cast<Propagator**>
1515
+ (home->alloc(2*n*sizeof(Propagator*))) + n;
1516
+ free(n);
1517
+ // Copy entries
1518
+ memcpy(prop, idx[0], n*sizeof(Propagator*));
1519
+ home->reuse(idx[0], n*sizeof(Propagator*));
1520
+ // Update index pointers
1521
+ ptrdiff_t o = prop - idx[0];
1522
+ idx[0] = prop;
1523
+ for (PropCond i = PC+1; i > 0; i--)
1524
+ idx[i] += o;
1525
+ }
1526
+ }
1527
+
1528
+
1529
+ /*
1530
+ * Cancelling a subscription
1531
+ *
1532
+ */
1533
+
1534
+ template <VarTypeId VTI, PropCond PC, class MED>
1535
+ forceinline void
1536
+ Variable<VTI,PC,MED>::cancel(Space* home, Propagator* p, PropCond pc) {
1537
+ if (idx[0] != NULL) {
1538
+ Propagator** f = idx[pc];
1539
+ #ifdef GECODE_AUDIT
1540
+ while (f < idx[pc+1])
1541
+ if (*f == p)
1542
+ goto found;
1543
+ else
1544
+ f++;
1545
+ GECODE_NEVER;
1546
+ found: ;
1547
+ #else
1548
+ while (*f != p) f++;
1549
+ #endif
1550
+ *f=*idx[pc];
1551
+ for (PropCond i=pc; i>0; i--)
1552
+ *(idx[i]++)=*(idx[i-1]);
1553
+ idx[0]++;
1554
+ free_inc();
1555
+ home->n_sub -= 1;
1556
+ }
1557
+ }
1558
+
1559
+ template <VarTypeId VTI, PropCond PC, class MED>
1560
+ forceinline void
1561
+ Variable<VTI,PC,MED>::notify(Space* home, ModEvent new_me) {
1562
+ if (modified()) {
1563
+ MED med;
1564
+ u.free_me ^= med(new_me,modevent());
1565
+ } else {
1566
+ _next = static_cast<Variable<VTI,PC,MED>*>(home->vars[VTI]);
1567
+ home->vars[VTI] = this;
1568
+ modevent(new_me);
1569
+ }
1570
+ }
1571
+
1572
+ template <VarTypeId VTI, PropCond PC, class MED>
1573
+ forceinline void
1574
+ Variable<VTI,PC,MED>::notify(Space* home) {
1575
+ assert(!modified());
1576
+ _next = static_cast<Variable<VTI,PC,MED>*>(home->vars[VTI]);
1577
+ home->vars[VTI] = this;
1578
+ modevent(ME_GEN_ASSIGNED);
1579
+ }
1580
+
1581
+
1582
+ /*
1583
+ * PROCESSING
1584
+ *
1585
+ */
1586
+
1587
+ template <VarTypeId VTI, PropCond PC, class MED>
1588
+ forceinline void
1589
+ Variable<VTI,PC,MED>::update(Variable<VTI,PC,MED>* x, Propagator**& sub) {
1590
+ // this refers to the variable to be updated (clone)
1591
+ // x refers to the original
1592
+ // Recover from copy (also overwrites forwarding pointer)
1593
+ x->u.free_me = u.free_me;
1594
+ Propagator** f = x->idx[0];
1595
+ int n = static_cast<int>(x->idx[PC+1] - f);
1596
+ u.free_me = 1 << 4;
1597
+ Propagator** t = sub + 1;
1598
+ sub += n+1;
1599
+ idx[0] = t;
1600
+ ptrdiff_t o = t - f;
1601
+ for (PropCond i = PC+1; i>0; i--)
1602
+ idx[i] = x->idx[i]+o;
1603
+ while ((n-4) >= 0) {
1604
+ n -= 4;
1605
+ t[0] = static_cast<Propagator*>(f[0]->prev());;
1606
+ t[1] = static_cast<Propagator*>(f[1]->prev());;
1607
+ t[2] = static_cast<Propagator*>(f[2]->prev());;
1608
+ t[3] = static_cast<Propagator*>(f[3]->prev());;
1609
+ t += 4; f += 4;
1610
+ }
1611
+ if ((n-2) >= 0) {
1612
+ n -= 2;
1613
+ t[0] = static_cast<Propagator*>(f[0]->prev());;
1614
+ t[1] = static_cast<Propagator*>(f[1]->prev());;
1615
+ t += 2; f += 2;
1616
+ }
1617
+ if (n > 0) {
1618
+ t[0] = static_cast<Propagator*>(f[0]->prev());;
1619
+ }
1620
+ }
1621
+
1622
+ template <VarTypeId VTI, PropCond PC, class MED>
1623
+ VarTypeProcessor<VTI,PC,MED>::VarTypeProcessor(void) {
1624
+ Space::vtp[VTI] = this;
1625
+ }
1626
+
1627
+ template <VarTypeId VTI, PropCond PC, class MED>
1628
+ void
1629
+ VarTypeProcessor<VTI,PC,MED>::update(VarBase* vb, Propagator**& sub) {
1630
+ Variable<VTI,PC,MED>* x = static_cast<Variable<VTI,PC,MED>*>(vb);
1631
+ do {
1632
+ x->forward()->update(x,sub); x = x->next();
1633
+ } while (x != NULL);
1634
+ }
1635
+
1636
+ template <VarTypeId VTI, PropCond PC, class MED>
1637
+ void
1638
+ VarTypeProcessor<VTI,PC,MED>::dispose(Space* home, VarBase* x) {}
1639
+
1640
+ /*
1641
+ * Processing a single modified variable
1642
+ *
1643
+ */
1644
+ template <VarTypeId VTI, PropCond PC, class MED>
1645
+ forceinline void
1646
+ Variable<VTI,PC,MED>::process(Space* home,
1647
+ PropCond pc1, PropCond pc2, ModEvent me) {
1648
+ Propagator** b = idx[pc1];
1649
+ Propagator** p = idx[pc2+1];
1650
+ while (p-- > b)
1651
+ home->process<VTI,MED>(*p,me);
1652
+ }
1653
+
1654
+ template <VarTypeId VTI, PropCond PC, class MED>
1655
+ forceinline void
1656
+ Variable<VTI,PC,MED>::process(Space* home) {
1657
+ // Entries in index structure are disabled. However they
1658
+ // must still work for cloning (idx[0]) and degree (idx[PC+1])
1659
+ Propagator** b = idx[0]; idx[0] = NULL;
1660
+ Propagator** p = idx[PC+1]; idx[PC+1] = NULL;
1661
+ /*
1662
+ * Decrement for p-b subscriptions
1663
+ *
1664
+ * Note that one would like to also decrement for the additional
1665
+ * single free slot that was counted initially. However, this
1666
+ * is not possible as there might be no free slot. So the number
1667
+ * of subscriptions is a conservative estimate and will be corrected
1668
+ * upon cloning.
1669
+ */
1670
+ home->n_sub -= p-b;
1671
+ // Information needed to release the dependency array
1672
+ unsigned int n = free() + (p-b);
1673
+ Propagator** s = p-n;
1674
+ while (p-- > b)
1675
+ home->process<VTI,MED>(*p);
1676
+ home->reuse(s,n*sizeof(Propagator*));
1677
+ }
1678
+
1679
+ }
1680
+
1681
+ // STATISTICS: kernel-core