gecoder-with-gecode 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
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