dep-selector-libgecode 1.0.0.alpha.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (806) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +26 -0
  3. data/Gemfile +3 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +29 -0
  6. data/Rakefile +20 -0
  7. data/dep-selector-libgecode.gemspec +25 -0
  8. data/ext/libgecode3/Makefile +8 -0
  9. data/ext/libgecode3/extconf.rb +57 -0
  10. data/ext/libgecode3/vendor/gecode-3.7.3/LICENSE +25 -0
  11. data/ext/libgecode3/vendor/gecode-3.7.3/Makefile.contribs +88 -0
  12. data/ext/libgecode3/vendor/gecode-3.7.3/Makefile.dep +11307 -0
  13. data/ext/libgecode3/vendor/gecode-3.7.3/Makefile.in +1795 -0
  14. data/ext/libgecode3/vendor/gecode-3.7.3/changelog.in +6132 -0
  15. data/ext/libgecode3/vendor/gecode-3.7.3/configure +13054 -0
  16. data/ext/libgecode3/vendor/gecode-3.7.3/configure.ac +356 -0
  17. data/ext/libgecode3/vendor/gecode-3.7.3/configure.ac.in +352 -0
  18. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/README +26 -0
  19. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/AbstractWorker.hh +42 -0
  20. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/Doxyfile +263 -0
  21. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/Makefile.in.in +162 -0
  22. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/OptVar.cc +82 -0
  23. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/OptVar.hh +124 -0
  24. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/QCOPPlus.cc +306 -0
  25. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/QCOPPlus.hh +166 -0
  26. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/QCSPPlusUnblockable.cc +239 -0
  27. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/QCSPPlusUnblockable.hh +140 -0
  28. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/README +6 -0
  29. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/Strategy.cc +253 -0
  30. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/Strategy.hh +112 -0
  31. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/StrategyNode.cc +59 -0
  32. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/StrategyNode.hh +49 -0
  33. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/UnblockableBranching.hh +34 -0
  34. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/UnblockableViewValBranching.cc +61 -0
  35. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/UnblockableViewValBranching.hh +45 -0
  36. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/Work.cc +48 -0
  37. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/Work.hh +64 -0
  38. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/WorkComparators.hh +67 -0
  39. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/WorkManager.cc +376 -0
  40. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/WorkManager.hh +96 -0
  41. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/Worker.cc +285 -0
  42. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/Worker.hh +70 -0
  43. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/clean +5 -0
  44. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/configure +2637 -0
  45. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/configure.ac +44 -0
  46. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/myDom.cc +59 -0
  47. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/myspace.cc +119 -0
  48. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/myspace.hh +79 -0
  49. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/qecode.hh +56 -0
  50. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/qsolver_parallel.cc +41 -0
  51. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/qsolver_parallel.hh +43 -0
  52. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/qsolver_qcop.cc +268 -0
  53. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/qsolver_qcop.hh +56 -0
  54. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/qsolver_qcsp.cc +163 -0
  55. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/qsolver_qcsp.hh +63 -0
  56. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/qsolver_unblockable.cc +423 -0
  57. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/qsolver_unblockable.hh +84 -0
  58. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/shortdesc.ac +1 -0
  59. data/ext/libgecode3/vendor/gecode-3.7.3/contribs/qecode/vartype.hh +31 -0
  60. data/ext/libgecode3/vendor/gecode-3.7.3/doxygen/doxygen.conf.in +1245 -0
  61. data/ext/libgecode3/vendor/gecode-3.7.3/doxygen/doxygen.hh.in +594 -0
  62. data/ext/libgecode3/vendor/gecode-3.7.3/examples/all-interval.cpp +136 -0
  63. data/ext/libgecode3/vendor/gecode-3.7.3/examples/alpha.cpp +151 -0
  64. data/ext/libgecode3/vendor/gecode-3.7.3/examples/bacp.cpp +596 -0
  65. data/ext/libgecode3/vendor/gecode-3.7.3/examples/bibd.cpp +182 -0
  66. data/ext/libgecode3/vendor/gecode-3.7.3/examples/bin-packing.cpp +25363 -0
  67. data/ext/libgecode3/vendor/gecode-3.7.3/examples/black-hole.cpp +413 -0
  68. data/ext/libgecode3/vendor/gecode-3.7.3/examples/car-sequencing.cpp +653 -0
  69. data/ext/libgecode3/vendor/gecode-3.7.3/examples/crew.cpp +269 -0
  70. data/ext/libgecode3/vendor/gecode-3.7.3/examples/crossword.cpp +3954 -0
  71. data/ext/libgecode3/vendor/gecode-3.7.3/examples/crowded-chess.cpp +424 -0
  72. data/ext/libgecode3/vendor/gecode-3.7.3/examples/dominating-queens.cpp +170 -0
  73. data/ext/libgecode3/vendor/gecode-3.7.3/examples/domino.cpp +346 -0
  74. data/ext/libgecode3/vendor/gecode-3.7.3/examples/donald.cpp +135 -0
  75. data/ext/libgecode3/vendor/gecode-3.7.3/examples/efpa.cpp +323 -0
  76. data/ext/libgecode3/vendor/gecode-3.7.3/examples/eq20.cpp +128 -0
  77. data/ext/libgecode3/vendor/gecode-3.7.3/examples/golf.cpp +190 -0
  78. data/ext/libgecode3/vendor/gecode-3.7.3/examples/golomb-ruler.cpp +157 -0
  79. data/ext/libgecode3/vendor/gecode-3.7.3/examples/graph-color.cpp +425 -0
  80. data/ext/libgecode3/vendor/gecode-3.7.3/examples/grocery.cpp +116 -0
  81. data/ext/libgecode3/vendor/gecode-3.7.3/examples/hamming.cpp +144 -0
  82. data/ext/libgecode3/vendor/gecode-3.7.3/examples/ind-set.cpp +144 -0
  83. data/ext/libgecode3/vendor/gecode-3.7.3/examples/kakuro.cpp +627 -0
  84. data/ext/libgecode3/vendor/gecode-3.7.3/examples/knights.cpp +430 -0
  85. data/ext/libgecode3/vendor/gecode-3.7.3/examples/langford-number.cpp +218 -0
  86. data/ext/libgecode3/vendor/gecode-3.7.3/examples/magic-sequence.cpp +133 -0
  87. data/ext/libgecode3/vendor/gecode-3.7.3/examples/magic-square.cpp +141 -0
  88. data/ext/libgecode3/vendor/gecode-3.7.3/examples/minesweeper.cpp +311 -0
  89. data/ext/libgecode3/vendor/gecode-3.7.3/examples/money.cpp +132 -0
  90. data/ext/libgecode3/vendor/gecode-3.7.3/examples/nonogram.cpp +1215 -0
  91. data/ext/libgecode3/vendor/gecode-3.7.3/examples/open-shop.cpp +412 -0
  92. data/ext/libgecode3/vendor/gecode-3.7.3/examples/ortho-latin.cpp +183 -0
  93. data/ext/libgecode3/vendor/gecode-3.7.3/examples/partition.cpp +145 -0
  94. data/ext/libgecode3/vendor/gecode-3.7.3/examples/pentominoes.cpp +952 -0
  95. data/ext/libgecode3/vendor/gecode-3.7.3/examples/perfect-square.cpp +317 -0
  96. data/ext/libgecode3/vendor/gecode-3.7.3/examples/photo.cpp +166 -0
  97. data/ext/libgecode3/vendor/gecode-3.7.3/examples/queen-armies.cpp +335 -0
  98. data/ext/libgecode3/vendor/gecode-3.7.3/examples/queens.cpp +214 -0
  99. data/ext/libgecode3/vendor/gecode-3.7.3/examples/radiotherapy.cpp +943 -0
  100. data/ext/libgecode3/vendor/gecode-3.7.3/examples/sat.cpp +260 -0
  101. data/ext/libgecode3/vendor/gecode-3.7.3/examples/schurs-lemma.cpp +142 -0
  102. data/ext/libgecode3/vendor/gecode-3.7.3/examples/scowl.hpp +14149 -0
  103. data/ext/libgecode3/vendor/gecode-3.7.3/examples/sports-league.cpp +353 -0
  104. data/ext/libgecode3/vendor/gecode-3.7.3/examples/steel-mill.cpp +654 -0
  105. data/ext/libgecode3/vendor/gecode-3.7.3/examples/steiner.cpp +170 -0
  106. data/ext/libgecode3/vendor/gecode-3.7.3/examples/sudoku.cpp +2294 -0
  107. data/ext/libgecode3/vendor/gecode-3.7.3/examples/tsp.cpp +339 -0
  108. data/ext/libgecode3/vendor/gecode-3.7.3/examples/warehouses.cpp +185 -0
  109. data/ext/libgecode3/vendor/gecode-3.7.3/examples/word-square.cpp +168 -0
  110. data/ext/libgecode3/vendor/gecode-3.7.3/gecode.m4 +1272 -0
  111. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/driver.hh +602 -0
  112. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/driver/options.cpp +435 -0
  113. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/driver/options.hpp +418 -0
  114. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/driver/script.cpp +104 -0
  115. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/driver/script.hpp +388 -0
  116. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc.hh +417 -0
  117. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/CHANGES +63 -0
  118. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/ast.hh +492 -0
  119. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/conexpr.hh +82 -0
  120. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/exampleplugin/myplugin.cpp +49 -0
  121. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/exampleplugin/myplugin.hh +47 -0
  122. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/exampleplugin/myplugin.pro +51 -0
  123. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/exampleplugin/test_myplugin.fzn +1 -0
  124. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/flatzinc.cpp +1056 -0
  125. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/lexer.lxx +137 -0
  126. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/lexer.yy.cpp +2458 -0
  127. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/all_different_int.mzn +37 -0
  128. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/all_equal_int.mzn +37 -0
  129. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/among.mzn +37 -0
  130. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/at_least_int.mzn +37 -0
  131. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/at_least_set.mzn +38 -0
  132. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/at_most_int.mzn +37 -0
  133. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/at_most_set.mzn +38 -0
  134. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/bin_packing.mzn +44 -0
  135. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/bin_packing_capa.mzn +45 -0
  136. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/bin_packing_load.mzn +45 -0
  137. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/circuit.mzn +40 -0
  138. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/count.mzn +37 -0
  139. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/cumulative.mzn +53 -0
  140. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/decreasing_bool.mzn +37 -0
  141. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/decreasing_int.mzn +37 -0
  142. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/diffn.mzn +44 -0
  143. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/disjoint.mzn +37 -0
  144. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/distribute.mzn +46 -0
  145. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/exactly_int.mzn +40 -0
  146. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/exactly_set.mzn +38 -0
  147. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/gecode.mzn +98 -0
  148. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/global_cardinality.mzn +43 -0
  149. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/global_cardinality_closed.mzn +39 -0
  150. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/global_cardinality_low_up.mzn +40 -0
  151. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/global_cardinality_low_up_closed.mzn +40 -0
  152. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/increasing_bool.mzn +37 -0
  153. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/increasing_int.mzn +37 -0
  154. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/int_set_channel.mzn +49 -0
  155. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/inverse.mzn +42 -0
  156. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/lex_less_int.mzn +42 -0
  157. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/lex_lesseq_int.mzn +42 -0
  158. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/link_set_to_booleans.mzn +47 -0
  159. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/maximum_int.mzn +37 -0
  160. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/member_bool.mzn +41 -0
  161. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/member_int.mzn +41 -0
  162. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/minimum_int.mzn +37 -0
  163. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/nvalue.mzn +37 -0
  164. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/partition_set.mzn +42 -0
  165. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/precedence.mzn +41 -0
  166. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/range.mzn +51 -0
  167. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/redefinitions.mzn +62 -0
  168. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/regular.mzn +38 -0
  169. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/roots.mzn +63 -0
  170. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/sort.mzn +37 -0
  171. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/sum_pred.mzn +42 -0
  172. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/table_bool.mzn +37 -0
  173. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/mznlib/table_int.mzn +37 -0
  174. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/option.hh +70 -0
  175. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/parser.hh +265 -0
  176. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/parser.tab.cpp +3571 -0
  177. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/parser.tab.hh +164 -0
  178. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/parser.yxx +1604 -0
  179. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/plugin.hh +83 -0
  180. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/registry.cpp +1812 -0
  181. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/registry.hh +71 -0
  182. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/symboltable.hh +96 -0
  183. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/flatzinc/varspec.hh +163 -0
  184. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist.hh +298 -0
  185. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/drawingcursor.cpp +288 -0
  186. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/drawingcursor.hh +110 -0
  187. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/drawingcursor.hpp +84 -0
  188. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/gecodelogo.cpp +673 -0
  189. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/gecodelogo.hh +65 -0
  190. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/gist.cpp +120 -0
  191. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/gist.hpp +207 -0
  192. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/layoutcursor.hh +69 -0
  193. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/layoutcursor.hpp +70 -0
  194. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/mainwindow.cpp +341 -0
  195. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/mainwindow.hh +129 -0
  196. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/node.cpp +82 -0
  197. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/node.hh +160 -0
  198. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/node.hpp +210 -0
  199. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/nodecursor.hh +215 -0
  200. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/nodecursor.hpp +271 -0
  201. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/nodestats.cpp +138 -0
  202. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/nodestats.hh +81 -0
  203. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/nodevisitor.hh +96 -0
  204. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/nodevisitor.hpp +126 -0
  205. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/nodewidget.cpp +90 -0
  206. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/nodewidget.hh +59 -0
  207. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/preferences.cpp +190 -0
  208. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/preferences.hh +96 -0
  209. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/qtgist.cpp +809 -0
  210. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/qtgist.hh +294 -0
  211. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/spacenode.cpp +369 -0
  212. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/spacenode.hh +221 -0
  213. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/spacenode.hpp +191 -0
  214. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/standalone-example/mygist.cpp +80 -0
  215. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/standalone-example/standalone_example.pro +18 -0
  216. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/stopbrancher.cpp +90 -0
  217. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/stopbrancher.hh +82 -0
  218. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/textoutput.cpp +175 -0
  219. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/textoutput.hh +75 -0
  220. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/treecanvas.cpp +1430 -0
  221. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/treecanvas.hh +369 -0
  222. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/visualnode.cpp +473 -0
  223. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/visualnode.hh +237 -0
  224. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/visualnode.hpp +220 -0
  225. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/gist/zoomToFitIcon.hpp +114 -0
  226. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int.hh +3477 -0
  227. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/arithmetic.cpp +185 -0
  228. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/arithmetic.hh +666 -0
  229. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/arithmetic/abs.hpp +236 -0
  230. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/arithmetic/divmod.hpp +350 -0
  231. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/arithmetic/max.hpp +398 -0
  232. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/arithmetic/mult.hpp +750 -0
  233. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/arithmetic/sqr.hpp +377 -0
  234. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/arithmetic/sqrt.hpp +217 -0
  235. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/array-traits.hpp +147 -0
  236. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/array.cpp +113 -0
  237. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/array.hpp +111 -0
  238. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/bin-packing.cpp +71 -0
  239. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/bin-packing.hh +184 -0
  240. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/bin-packing/propagate.cpp +388 -0
  241. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/bin-packing/propagate.hpp +219 -0
  242. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/bool.cpp +755 -0
  243. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/bool.hh +581 -0
  244. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/bool/base.hpp +137 -0
  245. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/bool/clause.hpp +353 -0
  246. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/bool/eq.hpp +196 -0
  247. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/bool/eqv.cpp +104 -0
  248. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/bool/eqv.hpp +202 -0
  249. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/bool/lq.hpp +241 -0
  250. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/bool/or.hpp +850 -0
  251. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/branch.cpp +152 -0
  252. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/branch.hh +607 -0
  253. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/branch/post-val-bool.hpp +81 -0
  254. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/branch/post-val-int.hpp +107 -0
  255. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/branch/post-view-bool.bs +121 -0
  256. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/branch/post-view-bool.cpp +438 -0
  257. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/branch/post-view-int.bs +121 -0
  258. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/branch/post-view-int.cpp +438 -0
  259. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/branch/select-val.hpp +229 -0
  260. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/branch/select-values.hpp +213 -0
  261. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/branch/select-view.hpp +364 -0
  262. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/channel.cpp +172 -0
  263. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/channel.hh +249 -0
  264. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/channel/base.hpp +78 -0
  265. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/channel/dom.hpp +332 -0
  266. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/channel/link-multi.cpp +241 -0
  267. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/channel/link-multi.hpp +84 -0
  268. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/channel/link-single.cpp +77 -0
  269. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/channel/link-single.hpp +71 -0
  270. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/channel/val.hpp +256 -0
  271. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/circuit.cpp +229 -0
  272. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/circuit.hh +160 -0
  273. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/circuit/base.hpp +270 -0
  274. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/circuit/dom.hpp +128 -0
  275. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/circuit/val.hpp +105 -0
  276. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/count.cpp +417 -0
  277. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/count.hh +410 -0
  278. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/count/int-base.hpp +80 -0
  279. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/count/int-eq.hpp +143 -0
  280. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/count/int-gq.hpp +137 -0
  281. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/count/int-lq.hpp +136 -0
  282. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/count/rel.hpp +281 -0
  283. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/count/view-base.hpp +131 -0
  284. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/count/view-eq.hpp +117 -0
  285. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/count/view-gq.hpp +109 -0
  286. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/count/view-lq.hpp +96 -0
  287. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/cumulative.cpp +432 -0
  288. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/cumulative.hh +745 -0
  289. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/cumulative/basic.hpp +211 -0
  290. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/cumulative/edge-finding.hpp +185 -0
  291. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/cumulative/man-prop.hpp +127 -0
  292. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/cumulative/opt-prop.hpp +171 -0
  293. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/cumulative/overload.hpp +63 -0
  294. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/cumulative/task-view.hpp +84 -0
  295. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/cumulative/task.hpp +256 -0
  296. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/cumulative/tree.hpp +272 -0
  297. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/cumulatives.cpp +187 -0
  298. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/cumulatives.hh +133 -0
  299. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/cumulatives/val.hpp +380 -0
  300. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/distinct.cpp +97 -0
  301. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/distinct.hh +314 -0
  302. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/distinct/bnd.hpp +444 -0
  303. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/distinct/dom-ctrl.hpp +81 -0
  304. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/distinct/dom.hpp +123 -0
  305. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/distinct/graph.hpp +266 -0
  306. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/distinct/ter-dom.hpp +113 -0
  307. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/distinct/val.hpp +185 -0
  308. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/dom.cpp +135 -0
  309. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/dom.hh +118 -0
  310. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/dom/range.hpp +105 -0
  311. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/dom/spec.hpp +124 -0
  312. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/element.cpp +190 -0
  313. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/element.hh +384 -0
  314. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/element/int.hpp +443 -0
  315. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/element/pair.cpp +151 -0
  316. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/element/pair.hpp +74 -0
  317. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/element/view.hpp +559 -0
  318. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/exception.hpp +196 -0
  319. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/exec.cpp +83 -0
  320. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/exec.hh +87 -0
  321. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/exec/when.cpp +77 -0
  322. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/exec/when.hpp +51 -0
  323. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/extensional.cpp +124 -0
  324. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/extensional.hh +508 -0
  325. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/extensional/base.hpp +163 -0
  326. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/extensional/basic.hpp +148 -0
  327. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/extensional/dfa.cpp +535 -0
  328. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/extensional/dfa.hpp +282 -0
  329. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/extensional/incremental.hpp +454 -0
  330. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/extensional/layered-graph.hpp +982 -0
  331. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/extensional/tuple-set.cpp +222 -0
  332. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/extensional/tuple-set.hpp +184 -0
  333. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/gcc.cpp +172 -0
  334. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/gcc.hh +268 -0
  335. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/gcc/bnd-sup.hpp +608 -0
  336. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/gcc/bnd.hpp +829 -0
  337. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/gcc/dom-sup.hpp +1777 -0
  338. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/gcc/dom.hpp +315 -0
  339. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/gcc/post.hpp +169 -0
  340. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/gcc/val.hpp +299 -0
  341. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/gcc/view.hpp +410 -0
  342. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/int-set-1.hpp +249 -0
  343. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/int-set-2.hpp +51 -0
  344. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/int-set.cpp +167 -0
  345. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/limits.hpp +94 -0
  346. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/linear-bool.cpp +196 -0
  347. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/linear-int.cpp +194 -0
  348. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/linear.hh +1560 -0
  349. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/linear/bool-int.hpp +743 -0
  350. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/linear/bool-post.cpp +602 -0
  351. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/linear/bool-scale.hpp +695 -0
  352. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/linear/bool-view.hpp +319 -0
  353. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/linear/int-bin.hpp +439 -0
  354. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/linear/int-dom.hpp +484 -0
  355. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/linear/int-nary.hpp +864 -0
  356. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/linear/int-noview.hpp +251 -0
  357. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/linear/int-post.cpp +561 -0
  358. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/linear/int-ter.hpp +273 -0
  359. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/linear/post.hpp +152 -0
  360. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/member.cpp +85 -0
  361. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/member.hh +125 -0
  362. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/member/prop.hpp +175 -0
  363. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/member/re-prop.hpp +178 -0
  364. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/no-overlap.cpp +226 -0
  365. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/no-overlap.hh +318 -0
  366. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/no-overlap/base.hpp +88 -0
  367. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/no-overlap/box.hpp +198 -0
  368. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/no-overlap/dim.hpp +197 -0
  369. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/no-overlap/man.hpp +119 -0
  370. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/no-overlap/opt.hpp +153 -0
  371. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/nvalues.cpp +244 -0
  372. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/nvalues.hh +429 -0
  373. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/nvalues/bool-base.hpp +98 -0
  374. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/nvalues/bool-eq.hpp +174 -0
  375. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/nvalues/bool-gq.hpp +149 -0
  376. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/nvalues/bool-lq.hpp +151 -0
  377. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/nvalues/graph.hpp +283 -0
  378. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/nvalues/int-base.hpp +347 -0
  379. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/nvalues/int-eq.hpp +167 -0
  380. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/nvalues/int-gq.hpp +130 -0
  381. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/nvalues/int-lq.hpp +154 -0
  382. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/nvalues/range-event.hpp +51 -0
  383. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/nvalues/sym-bit-matrix.hpp +69 -0
  384. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/precede.cpp +73 -0
  385. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/precede.hh +113 -0
  386. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/precede/single.hpp +232 -0
  387. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/propagator.hpp +311 -0
  388. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/rel.cpp +381 -0
  389. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/rel.hh +665 -0
  390. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/rel/eq.hpp +676 -0
  391. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/rel/lex.hpp +414 -0
  392. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/rel/lq-le.hpp +537 -0
  393. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/rel/nq.hpp +196 -0
  394. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/sequence.cpp +197 -0
  395. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/sequence.hh +154 -0
  396. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/sequence/int.hpp +168 -0
  397. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/sequence/set-op.hpp +154 -0
  398. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/sequence/view.hpp +499 -0
  399. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/sequence/violations.hpp +101 -0
  400. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/sorted.cpp +82 -0
  401. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/sorted.hh +107 -0
  402. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/sorted/matching.hpp +173 -0
  403. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/sorted/narrowing.hpp +250 -0
  404. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/sorted/order.hpp +213 -0
  405. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/sorted/propagate.hpp +646 -0
  406. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/sorted/sortsup.hpp +564 -0
  407. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/support-values.hh +154 -0
  408. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/support-values.hpp +187 -0
  409. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/task.hh +454 -0
  410. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/task/array.hpp +179 -0
  411. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/task/fwd-to-bwd.hpp +102 -0
  412. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/task/iter.hpp +92 -0
  413. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/task/man-to-opt.hpp +100 -0
  414. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/task/prop.hpp +70 -0
  415. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/task/purge.hpp +74 -0
  416. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/task/sort.hpp +234 -0
  417. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/task/tree.hpp +189 -0
  418. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/unary.cpp +258 -0
  419. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/unary.hh +839 -0
  420. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/unary/detectable.hpp +116 -0
  421. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/unary/edge-finding.hpp +78 -0
  422. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/unary/man-prop.hpp +78 -0
  423. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/unary/not-first-not-last.hpp +133 -0
  424. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/unary/opt-prop.hpp +116 -0
  425. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/unary/overload.hpp +93 -0
  426. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/unary/subsumption.hpp +55 -0
  427. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/unary/task-view.hpp +105 -0
  428. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/unary/task.hpp +532 -0
  429. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/unary/tree.hpp +229 -0
  430. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/unshare.cpp +146 -0
  431. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/val-set.hh +118 -0
  432. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/val-set.hpp +186 -0
  433. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/var-imp.hpp +710 -0
  434. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/var-imp/bool.cpp +65 -0
  435. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/var-imp/bool.hpp +431 -0
  436. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/var-imp/bool.vis +75 -0
  437. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/var-imp/delta.hpp +64 -0
  438. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/var-imp/int.cpp +361 -0
  439. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/var-imp/int.hpp +1029 -0
  440. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/var-imp/int.vis +117 -0
  441. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/var/bool.cpp +53 -0
  442. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/var/bool.hpp +121 -0
  443. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/var/int.cpp +61 -0
  444. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/var/int.hpp +145 -0
  445. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/var/print.hpp +56 -0
  446. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/view-val-graph.hh +334 -0
  447. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/view-val-graph/bi-link.hpp +89 -0
  448. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/view-val-graph/comb-ptr-flag.hpp +78 -0
  449. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/view-val-graph/edge.hpp +124 -0
  450. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/view-val-graph/graph.hpp +202 -0
  451. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/view-val-graph/iter-prune-val.hpp +70 -0
  452. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/view-val-graph/node.hpp +171 -0
  453. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/view.hpp +1690 -0
  454. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/view/bool-test.hpp +64 -0
  455. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/view/bool.hpp +314 -0
  456. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/view/cached.hpp +402 -0
  457. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/view/constint.hpp +324 -0
  458. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/view/int.hpp +264 -0
  459. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/view/iter.hpp +65 -0
  460. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/view/minus.hpp +300 -0
  461. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/view/neg-bool.hpp +177 -0
  462. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/view/offset.hpp +303 -0
  463. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/view/print.hpp +162 -0
  464. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/view/rel-test.hpp +231 -0
  465. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/view/scale.hpp +368 -0
  466. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/int/view/zero.hpp +305 -0
  467. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter.hh +96 -0
  468. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/ranges-add.hpp +144 -0
  469. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/ranges-append.hpp +222 -0
  470. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/ranges-array.hpp +139 -0
  471. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/ranges-cache.hpp +106 -0
  472. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/ranges-compl.hpp +220 -0
  473. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/ranges-diff.hpp +142 -0
  474. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/ranges-empty.hpp +111 -0
  475. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/ranges-inter.hpp +309 -0
  476. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/ranges-list.hpp +263 -0
  477. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/ranges-map.hpp +260 -0
  478. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/ranges-minmax.hpp +118 -0
  479. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/ranges-minus.hpp +107 -0
  480. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/ranges-negative.hpp +137 -0
  481. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/ranges-offset.hpp +127 -0
  482. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/ranges-operations.hpp +157 -0
  483. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/ranges-positive.hpp +139 -0
  484. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/ranges-rangelist.hpp +115 -0
  485. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/ranges-scale.hpp +238 -0
  486. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/ranges-singleton-append.hpp +111 -0
  487. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/ranges-singleton.hpp +86 -0
  488. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/ranges-size.hpp +146 -0
  489. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/ranges-union.hpp +361 -0
  490. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/ranges-values.hpp +140 -0
  491. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/values-array.hpp +120 -0
  492. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/values-bitset.hpp +114 -0
  493. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/values-inter.hpp +130 -0
  494. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/values-list.hpp +186 -0
  495. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/values-map.hpp +136 -0
  496. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/values-minus.hpp +105 -0
  497. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/values-negative.hpp +116 -0
  498. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/values-offset.hpp +113 -0
  499. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/values-positive.hpp +123 -0
  500. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/values-ranges.hpp +106 -0
  501. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/values-singleton.hpp +109 -0
  502. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/values-union.hpp +137 -0
  503. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/iter/values-unique.hpp +118 -0
  504. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel.hh +194 -0
  505. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/advisor.hpp +102 -0
  506. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/allocators.hpp +476 -0
  507. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/archive.cpp +70 -0
  508. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/archive.hpp +298 -0
  509. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/array.hpp +2133 -0
  510. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/branch.cpp +121 -0
  511. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/branch.hpp +254 -0
  512. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/brancher-tiebreak.hpp +615 -0
  513. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/brancher-val.hpp +126 -0
  514. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/brancher-view.hpp +455 -0
  515. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/brancher.hpp +431 -0
  516. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/core.cpp +563 -0
  517. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/core.hpp +3668 -0
  518. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/exception.hpp +124 -0
  519. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/global-prop-info.hpp +258 -0
  520. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/macros.hpp +118 -0
  521. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/memory-config.hpp +154 -0
  522. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/memory-manager.cpp +53 -0
  523. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/memory-manager.hpp +511 -0
  524. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/modevent.hpp +69 -0
  525. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/propagator.hpp +699 -0
  526. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/range-list.hpp +184 -0
  527. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/region.cpp +85 -0
  528. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/region.hpp +459 -0
  529. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/shared-array.hpp +345 -0
  530. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/var-imp.hpp +332 -0
  531. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/var-type.hpp +767 -0
  532. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/var.hpp +144 -0
  533. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/view.hpp +715 -0
  534. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/kernel/wait.hh +244 -0
  535. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/minimodel.hh +1870 -0
  536. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/minimodel/arithmetic.cpp +408 -0
  537. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/minimodel/bool-expr.cpp +522 -0
  538. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/minimodel/bool-expr.hpp +87 -0
  539. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/minimodel/exception.hpp +84 -0
  540. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/minimodel/lin-expr.cpp +594 -0
  541. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/minimodel/lin-expr.hpp +297 -0
  542. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/minimodel/lin-rel.cpp +414 -0
  543. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/minimodel/lin-rel.hpp +85 -0
  544. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/minimodel/matrix.hpp +247 -0
  545. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/minimodel/optimize.hpp +62 -0
  546. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/minimodel/reg.cpp +817 -0
  547. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/minimodel/reg.hpp +94 -0
  548. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/minimodel/set-expr.cpp +704 -0
  549. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/minimodel/set-expr.hpp +96 -0
  550. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/minimodel/set-rel.cpp +81 -0
  551. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/minimodel/set-rel.hpp +84 -0
  552. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search.hh +458 -0
  553. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/bab.cpp +62 -0
  554. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/bab.hpp +91 -0
  555. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/dfs.cpp +62 -0
  556. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/dfs.hpp +84 -0
  557. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/options.cpp +72 -0
  558. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/options.hpp +49 -0
  559. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/parallel/bab.cpp +178 -0
  560. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/parallel/bab.hh +203 -0
  561. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/parallel/dfs.cpp +176 -0
  562. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/parallel/dfs.hh +195 -0
  563. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/parallel/engine.cpp +118 -0
  564. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/parallel/engine.hh +418 -0
  565. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/parallel/path.hh +477 -0
  566. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/parallel/restart.cpp +167 -0
  567. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/parallel/restart.hh +73 -0
  568. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/restart.cpp +62 -0
  569. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/restart.hpp +88 -0
  570. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/sequential/bab.hh +177 -0
  571. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/sequential/dfs.hh +176 -0
  572. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/sequential/path.hh +411 -0
  573. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/sequential/restart.hh +89 -0
  574. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/statistics.hpp +70 -0
  575. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/stop.cpp +83 -0
  576. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/stop.hpp +137 -0
  577. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/support.hh +91 -0
  578. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/search/worker.hh +202 -0
  579. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set.hh +1144 -0
  580. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/array-traits.hpp +86 -0
  581. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/array.cpp +219 -0
  582. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/array.hpp +64 -0
  583. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/branch.cpp +128 -0
  584. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/branch.hh +438 -0
  585. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/branch/post-val.hpp +107 -0
  586. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/branch/post-view.bs +109 -0
  587. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/branch/post-view.cpp +370 -0
  588. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/branch/select-val.hpp +204 -0
  589. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/branch/select-view.hpp +306 -0
  590. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/cardinality.cpp +65 -0
  591. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/convex.cpp +60 -0
  592. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/convex.hh +107 -0
  593. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/convex/conv.cpp +97 -0
  594. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/convex/conv.hpp +67 -0
  595. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/convex/hull.cpp +116 -0
  596. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/convex/hull.hpp +68 -0
  597. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/distinct.cpp +56 -0
  598. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/distinct.hh +79 -0
  599. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/distinct/atmostOne.cpp +162 -0
  600. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/distinct/atmostOne.hpp +66 -0
  601. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/dom.cpp +300 -0
  602. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/element.cpp +255 -0
  603. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/element.hh +218 -0
  604. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/element/disjoint.hpp +324 -0
  605. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/element/inter.hpp +308 -0
  606. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/element/union.hpp +342 -0
  607. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/element/unionConst.hpp +293 -0
  608. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/exception.hpp +146 -0
  609. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/exec.cpp +58 -0
  610. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/int.cpp +191 -0
  611. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/int.hh +459 -0
  612. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/int/card.hpp +93 -0
  613. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/int/channel-bool.hpp +282 -0
  614. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/int/channel-int.hpp +158 -0
  615. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/int/match.hpp +199 -0
  616. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/int/minmax.hpp +645 -0
  617. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/int/weights.hpp +353 -0
  618. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/limits.hpp +62 -0
  619. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/precede.cpp +74 -0
  620. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/precede.hh +115 -0
  621. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/precede/single.hpp +255 -0
  622. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel-op-const-cvc.cpp +66 -0
  623. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel-op-const-cvv.cpp +65 -0
  624. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel-op-const-vcc.cpp +168 -0
  625. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel-op-const-vcv.cpp +166 -0
  626. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel-op-const-vvc.cpp +63 -0
  627. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel-op-singleton.cpp +115 -0
  628. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel-op-ternary.cpp +60 -0
  629. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel-op.cpp +105 -0
  630. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel-op.hh +297 -0
  631. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel-op/common.hpp +619 -0
  632. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel-op/inter.hpp +389 -0
  633. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel-op/partition.hpp +164 -0
  634. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel-op/post-compl-cvc.cpp +58 -0
  635. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel-op/post-compl-cvv.cpp +54 -0
  636. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel-op/post-compl-vvc.cpp +57 -0
  637. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel-op/post-compl.cpp +54 -0
  638. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel-op/post-nocompl-cvc.cpp +55 -0
  639. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel-op/post-nocompl-cvv.cpp +54 -0
  640. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel-op/post-nocompl-vvc.cpp +54 -0
  641. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel-op/post-nocompl.cpp +54 -0
  642. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel-op/post.hpp +266 -0
  643. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel-op/subofunion.hpp +166 -0
  644. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel-op/superofinter.hpp +167 -0
  645. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel-op/union.hpp +319 -0
  646. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel.cpp +232 -0
  647. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel.hh +322 -0
  648. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel/common.hpp +125 -0
  649. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel/eq.hpp +116 -0
  650. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel/lq.hpp +417 -0
  651. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel/nosubset.hpp +104 -0
  652. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel/nq.hpp +160 -0
  653. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel/re-eq.hpp +152 -0
  654. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel/re-lq.hpp +182 -0
  655. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel/re-subset.hpp +146 -0
  656. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/rel/subset.hpp +96 -0
  657. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/sequence.cpp +64 -0
  658. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/sequence.hh +115 -0
  659. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/sequence/common.hpp +100 -0
  660. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/sequence/seq-u.cpp +145 -0
  661. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/sequence/seq-u.hpp +79 -0
  662. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/sequence/seq.cpp +76 -0
  663. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/sequence/seq.hpp +69 -0
  664. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/var-imp.hpp +634 -0
  665. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/var-imp/delta.hpp +78 -0
  666. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/var-imp/integerset.cpp +348 -0
  667. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/var-imp/integerset.hpp +426 -0
  668. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/var-imp/iter.hpp +63 -0
  669. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/var-imp/set.cpp +142 -0
  670. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/var-imp/set.hpp +531 -0
  671. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/var-imp/set.vis +197 -0
  672. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/var/print.hpp +49 -0
  673. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/var/set.cpp +111 -0
  674. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/var/set.hpp +254 -0
  675. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/view.hpp +1142 -0
  676. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/view/cached.hpp +399 -0
  677. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/view/complement.hpp +556 -0
  678. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/view/const.hpp +723 -0
  679. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/view/print.hpp +140 -0
  680. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/view/set.hpp +263 -0
  681. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/set/view/singleton.hpp +402 -0
  682. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support.hh +135 -0
  683. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/auto-link.hpp +73 -0
  684. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/bitset-base.hpp +379 -0
  685. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/bitset.hpp +81 -0
  686. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/block-allocator.hpp +169 -0
  687. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/cast.hpp +52 -0
  688. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/config.hpp.in +109 -0
  689. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/dynamic-array.hpp +140 -0
  690. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/dynamic-queue.hpp +156 -0
  691. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/dynamic-stack.hpp +186 -0
  692. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/exception.cpp +65 -0
  693. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/exception.hpp +102 -0
  694. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/heap.cpp +49 -0
  695. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/heap.hpp +593 -0
  696. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/int-type.hpp +172 -0
  697. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/macros.hpp +103 -0
  698. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/marked-pointer.hpp +79 -0
  699. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/random.hpp +128 -0
  700. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/sort.hpp +268 -0
  701. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/static-stack.hpp +148 -0
  702. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/thread.hpp +272 -0
  703. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/thread/none.hpp +87 -0
  704. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/thread/pthreads.cpp +66 -0
  705. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/thread/pthreads.hpp +142 -0
  706. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/thread/thread.cpp +72 -0
  707. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/thread/thread.hpp +114 -0
  708. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/thread/windows.cpp +68 -0
  709. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/thread/windows.hpp +108 -0
  710. data/ext/libgecode3/vendor/gecode-3.7.3/gecode/support/timer.hpp +103 -0
  711. data/ext/libgecode3/vendor/gecode-3.7.3/install-sh +323 -0
  712. data/ext/libgecode3/vendor/gecode-3.7.3/misc/allexamples.perl +60 -0
  713. data/ext/libgecode3/vendor/gecode-3.7.3/misc/doxygen/back.png +0 -0
  714. data/ext/libgecode3/vendor/gecode-3.7.3/misc/doxygen/footer.html +3 -0
  715. data/ext/libgecode3/vendor/gecode-3.7.3/misc/doxygen/gecode-logo-100.png +0 -0
  716. data/ext/libgecode3/vendor/gecode-3.7.3/misc/doxygen/header.html +66 -0
  717. data/ext/libgecode3/vendor/gecode-3.7.3/misc/doxygen/stylesheet.css +468 -0
  718. data/ext/libgecode3/vendor/gecode-3.7.3/misc/fixautoheader.perl +55 -0
  719. data/ext/libgecode3/vendor/gecode-3.7.3/misc/fixmanifest.perl +84 -0
  720. data/ext/libgecode3/vendor/gecode-3.7.3/misc/fixproperties.sh +98 -0
  721. data/ext/libgecode3/vendor/gecode-3.7.3/misc/gecode-logo.ico +0 -0
  722. data/ext/libgecode3/vendor/gecode-3.7.3/misc/genbranch.perl +310 -0
  723. data/ext/libgecode3/vendor/gecode-3.7.3/misc/genchangelog.perl +249 -0
  724. data/ext/libgecode3/vendor/gecode-3.7.3/misc/gencurrentchangelog.perl +191 -0
  725. data/ext/libgecode3/vendor/gecode-3.7.3/misc/genlcovmakefile.perl +148 -0
  726. data/ext/libgecode3/vendor/gecode-3.7.3/misc/genlicense.perl +121 -0
  727. data/ext/libgecode3/vendor/gecode-3.7.3/misc/genrc.perl +236 -0
  728. data/ext/libgecode3/vendor/gecode-3.7.3/misc/genstatistics.perl +178 -0
  729. data/ext/libgecode3/vendor/gecode-3.7.3/misc/gentxtchangelog.perl +198 -0
  730. data/ext/libgecode3/vendor/gecode-3.7.3/misc/genvarimp.perl +877 -0
  731. data/ext/libgecode3/vendor/gecode-3.7.3/misc/genxcodeproj.perl +144 -0
  732. data/ext/libgecode3/vendor/gecode-3.7.3/misc/getrevision.perl +47 -0
  733. data/ext/libgecode3/vendor/gecode-3.7.3/misc/makedepend.perl +85 -0
  734. data/ext/libgecode3/vendor/gecode-3.7.3/misc/svn-ignore-root.txt +43 -0
  735. data/ext/libgecode3/vendor/gecode-3.7.3/misc/svn-ignore.txt +18 -0
  736. data/ext/libgecode3/vendor/gecode-3.7.3/test/afc.cpp +143 -0
  737. data/ext/libgecode3/vendor/gecode-3.7.3/test/array.cpp +277 -0
  738. data/ext/libgecode3/vendor/gecode-3.7.3/test/assign.cpp +278 -0
  739. data/ext/libgecode3/vendor/gecode-3.7.3/test/assign.hh +119 -0
  740. data/ext/libgecode3/vendor/gecode-3.7.3/test/assign/bool.cpp +61 -0
  741. data/ext/libgecode3/vendor/gecode-3.7.3/test/assign/int.cpp +70 -0
  742. data/ext/libgecode3/vendor/gecode-3.7.3/test/assign/set.cpp +72 -0
  743. data/ext/libgecode3/vendor/gecode-3.7.3/test/branch.cpp +504 -0
  744. data/ext/libgecode3/vendor/gecode-3.7.3/test/branch.hh +119 -0
  745. data/ext/libgecode3/vendor/gecode-3.7.3/test/branch/bool.cpp +61 -0
  746. data/ext/libgecode3/vendor/gecode-3.7.3/test/branch/int.cpp +70 -0
  747. data/ext/libgecode3/vendor/gecode-3.7.3/test/branch/set.cpp +72 -0
  748. data/ext/libgecode3/vendor/gecode-3.7.3/test/int.cpp +655 -0
  749. data/ext/libgecode3/vendor/gecode-3.7.3/test/int.hh +353 -0
  750. data/ext/libgecode3/vendor/gecode-3.7.3/test/int.hpp +314 -0
  751. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/arithmetic.cpp +772 -0
  752. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/basic.cpp +82 -0
  753. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/bin-packing.cpp +237 -0
  754. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/bool.cpp +500 -0
  755. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/channel.cpp +234 -0
  756. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/circuit.cpp +359 -0
  757. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/count.cpp +410 -0
  758. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/cumulative.cpp +560 -0
  759. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/cumulatives.cpp +276 -0
  760. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/distinct.cpp +248 -0
  761. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/dom.cpp +174 -0
  762. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/element.cpp +602 -0
  763. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/exec.cpp +150 -0
  764. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/extensional.cpp +571 -0
  765. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/gcc.cpp +320 -0
  766. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/linear.cpp +394 -0
  767. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/member.cpp +138 -0
  768. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/mm-arithmetic.cpp +368 -0
  769. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/mm-bool.cpp +4344 -0
  770. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/mm-count.cpp +295 -0
  771. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/mm-lin.cpp +2179 -0
  772. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/mm-rel.cpp +136 -0
  773. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/no-overlap.cpp +259 -0
  774. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/nvalues.cpp +241 -0
  775. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/precede.cpp +115 -0
  776. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/rel.cpp +568 -0
  777. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/sequence.cpp +168 -0
  778. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/sorted.cpp +165 -0
  779. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/unary.cpp +327 -0
  780. data/ext/libgecode3/vendor/gecode-3.7.3/test/int/unshare.cpp +109 -0
  781. data/ext/libgecode3/vendor/gecode-3.7.3/test/search.cpp +487 -0
  782. data/ext/libgecode3/vendor/gecode-3.7.3/test/set.cpp +638 -0
  783. data/ext/libgecode3/vendor/gecode-3.7.3/test/set.hh +362 -0
  784. data/ext/libgecode3/vendor/gecode-3.7.3/test/set.hpp +121 -0
  785. data/ext/libgecode3/vendor/gecode-3.7.3/test/set/construct.cpp +225 -0
  786. data/ext/libgecode3/vendor/gecode-3.7.3/test/set/convex.cpp +139 -0
  787. data/ext/libgecode3/vendor/gecode-3.7.3/test/set/distinct.cpp +116 -0
  788. data/ext/libgecode3/vendor/gecode-3.7.3/test/set/dom.cpp +346 -0
  789. data/ext/libgecode3/vendor/gecode-3.7.3/test/set/element.cpp +397 -0
  790. data/ext/libgecode3/vendor/gecode-3.7.3/test/set/exec.cpp +86 -0
  791. data/ext/libgecode3/vendor/gecode-3.7.3/test/set/int.cpp +532 -0
  792. data/ext/libgecode3/vendor/gecode-3.7.3/test/set/mm-set.cpp +4532 -0
  793. data/ext/libgecode3/vendor/gecode-3.7.3/test/set/precede.cpp +136 -0
  794. data/ext/libgecode3/vendor/gecode-3.7.3/test/set/rel-op-const.cpp +368 -0
  795. data/ext/libgecode3/vendor/gecode-3.7.3/test/set/rel-op.cpp +504 -0
  796. data/ext/libgecode3/vendor/gecode-3.7.3/test/set/rel.cpp +157 -0
  797. data/ext/libgecode3/vendor/gecode-3.7.3/test/set/sequence.cpp +133 -0
  798. data/ext/libgecode3/vendor/gecode-3.7.3/test/test.cpp +281 -0
  799. data/ext/libgecode3/vendor/gecode-3.7.3/test/test.hh +161 -0
  800. data/ext/libgecode3/vendor/gecode-3.7.3/test/test.hpp +76 -0
  801. data/ext/libgecode3/vendor/gecode-3.7.3/tools/flatzinc/fz.cpp +93 -0
  802. data/ext/libgecode3/vendor/gecode-3.7.3/tools/flatzinc/mzn-gecode.bat.in +41 -0
  803. data/ext/libgecode3/vendor/gecode-3.7.3/tools/flatzinc/mzn-gecode.in +41 -0
  804. data/lib/dep-selector-libgecode.rb +15 -0
  805. data/lib/dep-selector-libgecode/version.rb +3 -0
  806. metadata +878 -0
@@ -0,0 +1,3668 @@
1
+ /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Main authors:
4
+ * Christian Schulte <schulte@gecode.org>
5
+ * Guido Tack <tack@gecode.org>
6
+ * Mikael Lagerkvist <lagerkvist@gecode.org>
7
+ *
8
+ * Contributing authors:
9
+ * Filip Konvicka <filip.konvicka@logis.cz>
10
+ *
11
+ * Copyright:
12
+ * Christian Schulte, 2002
13
+ * Guido Tack, 2003
14
+ * Mikael Lagerkvist, 2006
15
+ * LOGIS, s.r.o., 2009
16
+ *
17
+ * Bugfixes provided by:
18
+ * Alexander Samoilov <alexander_samoilov@yahoo.com>
19
+ *
20
+ * Last modified:
21
+ * $Date: 2012-02-22 16:18:28 +1100 (Wed, 22 Feb 2012) $ by $Author: tack $
22
+ * $Revision: 12538 $
23
+ *
24
+ * This file is part of Gecode, the generic constraint
25
+ * development environment:
26
+ * http://www.gecode.org
27
+ *
28
+ * Permission is hereby granted, free of charge, to any person obtaining
29
+ * a copy of this software and associated documentation files (the
30
+ * "Software"), to deal in the Software without restriction, including
31
+ * without limitation the rights to use, copy, modify, merge, publish,
32
+ * distribute, sublicense, and/or sell copies of the Software, and to
33
+ * permit persons to whom the Software is furnished to do so, subject to
34
+ * the following conditions:
35
+ *
36
+ * The above copyright notice and this permission notice shall be
37
+ * included in all copies or substantial portions of the Software.
38
+ *
39
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
40
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
41
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
42
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
43
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
44
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
45
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
46
+ *
47
+ */
48
+ #include <iostream>
49
+ namespace Gecode {
50
+
51
+ class Space;
52
+
53
+ /**
54
+ * \defgroup FuncSupportShared Support for shared objects and handles
55
+ *
56
+ * Shared handles provide access to reference-counted objects. In
57
+ * particular, they support updates with and without sharing.
58
+ * An update with sharing just updates the handle, while a non-shared
59
+ * update creates a single copy per space.
60
+ *
61
+ * \ingroup FuncSupport
62
+ */
63
+
64
+ /**
65
+ * \brief The shared handle
66
+ *
67
+ * A shared handle provides access to an object that lives outside a space,
68
+ * and is shared between entities that possibly reside inside different
69
+ * spaces. The handle has an update mechanism that supports updates with and
70
+ * without sharing. An update without sharing makes sure that a
71
+ * single copy of the object is created when the space is copied.
72
+ *
73
+ * This is the base class that all shared handles must inherit from.
74
+ *
75
+ * \ingroup FuncSupportShared
76
+ */
77
+ class SharedHandle {
78
+ public:
79
+ /**
80
+ * \brief The shared object
81
+ *
82
+ * Shared objects must inherit from this base class.
83
+ *
84
+ * \ingroup FuncSupportShared
85
+ */
86
+ class Object {
87
+ friend class Space;
88
+ friend class SharedHandle;
89
+ private:
90
+ /// The next object collected during copying
91
+ Object* next;
92
+ /// The forwarding pointer
93
+ Object* fwd;
94
+ /// The counter used for reference counting
95
+ unsigned int use_cnt;
96
+ public:
97
+ /// Initialize
98
+ Object(void);
99
+ /// Return fresh copy for update
100
+ virtual Object* copy(void) const = 0;
101
+ /// Delete shared object
102
+ virtual ~Object(void);
103
+ /// Allocate memory from heap
104
+ static void* operator new(size_t s);
105
+ /// Free memory allocated from heap
106
+ static void operator delete(void* p);
107
+ };
108
+ private:
109
+ /// The shared object
110
+ Object* o;
111
+ /// Subscribe handle to object
112
+ void subscribe(void);
113
+ /// Cancel subscription of handle to object
114
+ void cancel(void);
115
+ public:
116
+ /// Create shared handle with no object pointing to
117
+ SharedHandle(void);
118
+ /// Create shared handle that points to shared object \a so
119
+ SharedHandle(SharedHandle::Object* so);
120
+ /// Copy constructor maintaining reference count
121
+ SharedHandle(const SharedHandle& sh);
122
+ /// Assignment operator mainitaining reference count
123
+ SharedHandle& operator =(const SharedHandle& sh);
124
+ /// Updating during cloning
125
+ void update(Space& home, bool share, SharedHandle& sh);
126
+ /// Destructor that maintains reference count
127
+ ~SharedHandle(void);
128
+ protected:
129
+ /// Access to the shared object
130
+ SharedHandle::Object* object(void) const;
131
+ /// Modify shared object
132
+ void object(SharedHandle::Object* n);
133
+ };
134
+
135
+ /**
136
+ * \defgroup TaskVarMEPC Generic modification events and propagation conditions
137
+ *
138
+ * Predefined modification events must be taken into account
139
+ * by variable types.
140
+ * \ingroup TaskVar
141
+ */
142
+ //@{
143
+ /// Type for modification events
144
+ typedef int ModEvent;
145
+
146
+ /// Generic modification event: failed variable
147
+ const ModEvent ME_GEN_FAILED = -1;
148
+ /// Generic modification event: no modification
149
+ const ModEvent ME_GEN_NONE = 0;
150
+ /// Generic modification event: variable is assigned a value
151
+ const ModEvent ME_GEN_ASSIGNED = 1;
152
+
153
+ /// Type for propagation conditions
154
+ typedef int PropCond;
155
+ /// Propagation condition to be ignored (convenience)
156
+ const PropCond PC_GEN_NONE = -1;
157
+ /// Propagation condition for an assigned variable
158
+ const PropCond PC_GEN_ASSIGNED = 0;
159
+ //@}
160
+
161
+ /**
162
+ * \brief Modification event deltas
163
+ *
164
+ * Modification event deltas are used by propagators. A
165
+ * propagator stores a modification event for each variable type.
166
+ * They can be accessed through a variable or a view from a given
167
+ * propagator. They can be constructed from a given modevent by
168
+ * a variable or view.
169
+ * \ingroup TaskActor
170
+ */
171
+ typedef int ModEventDelta;
172
+
173
+ }
174
+
175
+ #include <gecode/kernel/var-type.hpp>
176
+
177
+ namespace Gecode {
178
+
179
+ /// Configuration class for variable implementations without index structure
180
+ class NoIdxVarImpConf {
181
+ public:
182
+ /// Index for update
183
+ static const int idx_c = -1;
184
+ /// Index for disposal
185
+ static const int idx_d = -1;
186
+ /// Maximal propagation condition
187
+ static const PropCond pc_max = PC_GEN_ASSIGNED;
188
+ /// Freely available bits
189
+ static const int free_bits = 0;
190
+ /// Start of bits for modification event delta
191
+ static const int med_fst = 0;
192
+ /// End of bits for modification event delta
193
+ static const int med_lst = 0;
194
+ /// Bitmask for modification event delta
195
+ static const int med_mask = 0;
196
+ /// Combine modification events \a me1 and \a me2
197
+ static Gecode::ModEvent me_combine(ModEvent me1, ModEvent me2);
198
+ /// Update modification even delta \a med by \a me, return true on change
199
+ static bool med_update(ModEventDelta& med, ModEvent me);
200
+ };
201
+
202
+ forceinline ModEvent
203
+ NoIdxVarImpConf::me_combine(ModEvent, ModEvent) {
204
+ GECODE_NEVER; return 0;
205
+ }
206
+ forceinline bool
207
+ NoIdxVarImpConf::med_update(ModEventDelta&, ModEvent) {
208
+ GECODE_NEVER; return false;
209
+ }
210
+
211
+
212
+ /*
213
+ * These are the classes of interest
214
+ *
215
+ */
216
+ class ActorLink;
217
+ class Actor;
218
+ class Propagator;
219
+ class LocalObject;
220
+ class Advisor;
221
+ template<class A> class Council;
222
+ template<class A> class Advisors;
223
+ template<class VIC> class VarImp;
224
+
225
+
226
+ /*
227
+ * Variable implementations
228
+ *
229
+ */
230
+
231
+ /**
232
+ * \brief Base-class for variable implementations
233
+ *
234
+ * Serves as base-class that can be used without having to know any
235
+ * template arguments.
236
+ * \ingroup TaskVar
237
+ */
238
+ class VarImpBase {};
239
+
240
+ /**
241
+ * \brief Base class for %Variable type disposer
242
+ *
243
+ * Controls disposal of variable implementations.
244
+ * \ingroup TaskVar
245
+ */
246
+ class GECODE_VTABLE_EXPORT VarImpDisposerBase {
247
+ public:
248
+ /// Dispose list of variable implementations starting at \a x
249
+ GECODE_KERNEL_EXPORT virtual void dispose(Space& home, VarImpBase* x);
250
+ /// Destructor (not used)
251
+ GECODE_KERNEL_EXPORT virtual ~VarImpDisposerBase(void);
252
+ };
253
+
254
+ /**
255
+ * \brief %Variable implementation disposer
256
+ *
257
+ * Controls disposal of variable implementations.
258
+ * \ingroup TaskVar
259
+ */
260
+ template<class VarImp>
261
+ class VarImpDisposer : public VarImpDisposerBase {
262
+ public:
263
+ /// Constructor (registers disposer with kernel)
264
+ VarImpDisposer(void);
265
+ /// Dispose list of variable implementations starting at \a x
266
+ virtual void dispose(Space& home, VarImpBase* x);
267
+ };
268
+
269
+ /// Generic domain change information to be supplied to advisors
270
+ class Delta {
271
+ template<class VIC> friend class VarImp;
272
+ private:
273
+ /// Modification event
274
+ ModEvent me;
275
+ };
276
+
277
+ /**
278
+ * \brief Base-class for variable implementations
279
+ *
280
+ * Implements variable implementation for variable implementation
281
+ * configuration of type \a VIC.
282
+ * \ingroup TaskVar
283
+ */
284
+ template<class VIC>
285
+ class VarImp : public VarImpBase {
286
+ friend class Space;
287
+ friend class Propagator;
288
+ template<class VarImp> friend class VarImpDisposer;
289
+ private:
290
+ union {
291
+ /**
292
+ * \brief Subscribed actors
293
+ *
294
+ * The base pointer of the array of subscribed actors.
295
+ *
296
+ * This pointer must be first to avoid padding on 64 bit machines.
297
+ */
298
+ ActorLink** base;
299
+ /**
300
+ * \brief Forwarding pointer
301
+ *
302
+ * During cloning, this is used as the forwarding pointer for the
303
+ * variable. The original value is saved in the copy and restored after
304
+ * cloning.
305
+ *
306
+ */
307
+ VarImp<VIC>* fwd;
308
+ } b;
309
+
310
+ /// Index for update
311
+ static const int idx_c = VIC::idx_c;
312
+ /// Index for disposal
313
+ static const int idx_d = VIC::idx_d;
314
+ /// Number of freely available bits
315
+ static const int free_bits = VIC::free_bits;
316
+ /// Number of used subscription entries
317
+ unsigned int entries;
318
+ /// Number of free subscription entries
319
+ unsigned int free_and_bits;
320
+ /// Maximal propagation condition
321
+ static const Gecode::PropCond pc_max = VIC::pc_max;
322
+
323
+ union {
324
+ /**
325
+ * \brief Indices of subscribed actors
326
+ *
327
+ * The entries from base[0] to base[idx[pc_max]] are propagators,
328
+ * where the entries between base[idx[pc-1]] and base[idx[pc]] are
329
+ * the propagators that have subscribed with propagation condition pc.
330
+ *
331
+ * The entries between base[idx[pc_max]] and base[idx[pc_max+1]] are the
332
+ * advisors subscribed to the variable implementation.
333
+ */
334
+ unsigned int idx[pc_max+1];
335
+ /// During cloning, points to the next copied variable
336
+ VarImp<VIC>* next;
337
+ } u;
338
+
339
+ /// Return subscribed actor at index \a pc
340
+ ActorLink** actor(PropCond pc);
341
+ /// Return subscribed actor at index \a pc, where \a pc is non-zero
342
+ ActorLink** actorNonZero(PropCond pc);
343
+ /// Return reference to index \a pc, where \a pc is non-zero
344
+ unsigned int& idx(PropCond pc);
345
+ /// Return index \a pc, where \a pc is non-zero
346
+ unsigned int idx(PropCond pc) const;
347
+
348
+ /**
349
+ * \brief Update copied variable \a x
350
+ *
351
+ * The argument \a sub gives the memory area where subscriptions are
352
+ * to be stored.
353
+ */
354
+ void update(VarImp* x, ActorLink**& sub);
355
+ /**
356
+ * \brief Update all copied variables of this type
357
+ *
358
+ * The argument \a sub gives the memory area where subscriptions are
359
+ * to be stored.
360
+ */
361
+ static void update(Space& home, ActorLink**& sub);
362
+
363
+ /// Enter propagator to subscription array
364
+ void enter(Space& home, Propagator* p, PropCond pc);
365
+ /// Enter advisor to subscription array
366
+ void enter(Space& home, Advisor* a);
367
+ /// Resize subscription array
368
+ void resize(Space& home);
369
+ /// Remove propagator from subscription array
370
+ void remove(Space& home, Propagator* p, PropCond pc);
371
+ /// Remove advisor from subscription array
372
+ void remove(Space& home, Advisor* a);
373
+
374
+
375
+ protected:
376
+ /// Cancel all subscriptions when variable implementation is assigned
377
+ void cancel(Space& home);
378
+ /**
379
+ * \brief Run advisors when variable implementation has been modified with modification event \a me and domain change \a d
380
+ *
381
+ * Returns false if an advisor has failed.
382
+ */
383
+ bool advise(Space& home, ModEvent me, Delta& d);
384
+ #ifdef GECODE_HAS_VAR_DISPOSE
385
+ /// Return reference to variables (dispose)
386
+ static VarImp<VIC>* vars_d(Space& home);
387
+ /// Set reference to variables (dispose)
388
+ static void vars_d(Space& home, VarImp<VIC>* x);
389
+ #endif
390
+
391
+ public:
392
+ /// Creation
393
+ VarImp(Space& home);
394
+ /// Creation of static instances
395
+ VarImp(void);
396
+
397
+ /// \name Dependencies
398
+ //@{
399
+ /** \brief Subscribe propagator \a p with propagation condition \a pc
400
+ *
401
+ * In case \a schedule is false, the propagator is just subscribed but
402
+ * not scheduled for execution (this must be used when creating
403
+ * subscriptions during propagation).
404
+ *
405
+ * In case the variable is assigned (that is, \a assigned is
406
+ * true), the subscribing propagator is scheduled for execution.
407
+ * Otherwise, the propagator subscribes and is scheduled for execution
408
+ * with modification event \a me provided that \a pc is different
409
+ * from \a PC_GEN_ASSIGNED.
410
+ */
411
+ void subscribe(Space& home, Propagator& p, PropCond pc,
412
+ bool assigned, ModEvent me, bool schedule);
413
+ /** \brief Cancel subscription of propagator \a p with propagation condition \a pc
414
+ *
415
+ * If the variable is assigned, \a assigned must be true.
416
+ *
417
+ */
418
+ void cancel(Space& home, Propagator& p, PropCond pc,
419
+ bool assigned);
420
+ /** \brief Subscribe advisor \a a to variable
421
+ *
422
+ * The advisor \a a is only subscribed if \a assigned is false.
423
+ *
424
+ */
425
+ void subscribe(Space& home, Advisor& a, bool assigned);
426
+ /** \brief Cancel subscription of advisor \a a
427
+ *
428
+ * If the variable is assigned, \a assigned must be true.
429
+ *
430
+ */
431
+ void cancel(Space& home, Advisor& a, bool assigned);
432
+
433
+ /**
434
+ * \brief Return degree (number of subscribed propagators and advisors)
435
+ *
436
+ * Note that the degree of a variable implementation is not available
437
+ * during cloning.
438
+ */
439
+ unsigned int degree(void) const;
440
+ /**
441
+ * \brief Return accumulated failure count (plus degree)
442
+ *
443
+ * Note that the accumulated failure count of a variable implementation
444
+ * is not available during cloning.
445
+ */
446
+ double afc(void) const;
447
+ //@}
448
+
449
+ /// \name Cloning variables
450
+ //@{
451
+ /// Constructor for cloning
452
+ VarImp(Space& home, bool share, VarImp& x);
453
+ /// Is variable already copied
454
+ bool copied(void) const;
455
+ /// Use forward pointer if variable already copied
456
+ VarImp* forward(void) const;
457
+ /// Return next copied variable
458
+ VarImp* next(void) const;
459
+ //@}
460
+
461
+ /// \name Variable implementation-dependent propagator support
462
+ //@{
463
+ /**
464
+ * \brief Schedule propagator \a p with modification event \a me
465
+ *
466
+ * If \a force is true, the propagator is re-scheduled (including
467
+ * cost computation) even though its modification event delta has
468
+ * not changed.
469
+ */
470
+ static void schedule(Space& home, Propagator& p, ModEvent me,
471
+ bool force = false);
472
+ /// Project modification event for this variable type from \a med
473
+ static ModEvent me(const ModEventDelta& med);
474
+ /// Translate modification event \a me into modification event delta
475
+ static ModEventDelta med(ModEvent me);
476
+ /// Combine modifications events \a me1 and \a me2
477
+ static ModEvent me_combine(ModEvent me1, ModEvent me2);
478
+ //@}
479
+
480
+ /// \name Delta information for advisors
481
+ //@{
482
+ /// Return modification event
483
+ static ModEvent modevent(const Delta& d);
484
+ //@}
485
+
486
+ /// \name Bit management
487
+ //@{
488
+ /// Provide access to free bits
489
+ unsigned int bits(void) const;
490
+ /// Provide access to free bits
491
+ unsigned int& bits(void);
492
+ //@}
493
+
494
+ protected:
495
+ /// Schedule subscribed propagators
496
+ void schedule(Space& home, PropCond pc1, PropCond pc2, ModEvent me);
497
+
498
+ public:
499
+ /// \name Memory management
500
+ //@{
501
+ /// Allocate memory from space
502
+ static void* operator new(size_t,Space&);
503
+ /// Return memory to space
504
+ static void operator delete(void*,Space&);
505
+ /// Needed for exceptions
506
+ static void operator delete(void*);
507
+ //@}
508
+ };
509
+
510
+ /**
511
+ * \defgroup TaskActorStatus Status of constraint propagation and branching commit
512
+ * Note that the enum values starting with a double underscore should not
513
+ * be used directly. Instead, use the provided functions with the same
514
+ * name without leading underscores.
515
+ *
516
+ * \ingroup TaskActor
517
+ */
518
+ enum ExecStatus {
519
+ __ES_SUBSUMED = -2, ///< Internal: propagator is subsumed, do not use
520
+ ES_FAILED = -1, ///< Execution has resulted in failure
521
+ ES_NOFIX = 0, ///< Propagation has not computed fixpoint
522
+ ES_OK = 0, ///< Execution is okay
523
+ ES_FIX = 1, ///< Propagation has computed fixpoint
524
+ ES_NOFIX_FORCE = 2, ///< Advisor forces rescheduling of propagator
525
+ __ES_PARTIAL = 2 ///< Internal: propagator has computed partial fixpoint, do not use
526
+ };
527
+
528
+ /**
529
+ * \brief Propagation cost
530
+ * \ingroup TaskActor
531
+ */
532
+ class PropCost {
533
+ friend class Space;
534
+ public:
535
+ /// The actual cost values that are used
536
+ enum ActualCost {
537
+ AC_CRAZY_LO = 0, ///< Exponential complexity, cheap
538
+ AC_CRAZY_HI = 0, ///< Exponential complexity, expensive
539
+ AC_CUBIC_LO = 1, ///< Cubic complexity, cheap
540
+ AC_CUBIC_HI = 1, ///< Cubic complexity, expensive
541
+ AC_QUADRATIC_LO = 2, ///< Quadratic complexity, cheap
542
+ AC_QUADRATIC_HI = 2, ///< Quadratic complexity, expensive
543
+ AC_LINEAR_HI = 3, ///< Linear complexity, expensive
544
+ AC_LINEAR_LO = 4, ///< Linear complexity, cheap
545
+ AC_TERNARY_HI = 4, ///< Three variables, expensive
546
+ AC_BINARY_HI = 5, ///< Two variables, expensive
547
+ AC_TERNARY_LO = 5, ///< Three variables, cheap
548
+ AC_BINARY_LO = 6, ///< Two variables, cheap
549
+ AC_UNARY_LO = 6, ///< Only single variable, cheap
550
+ AC_UNARY_HI = 6, ///< Only single variable, expensive
551
+ AC_MAX = 6 ///< Maximal cost value
552
+ };
553
+ /// Actual cost
554
+ ActualCost ac;
555
+ public:
556
+ /// Propagation cost modifier
557
+ enum Mod {
558
+ LO, ///< Cheap
559
+ HI ///< Expensive
560
+ };
561
+ private:
562
+ /// Compute dynamic cost for cost \a lo, expensive cost \a hi, and size measure \a n
563
+ static PropCost cost(Mod m, ActualCost lo, ActualCost hi, unsigned int n);
564
+ /// Constructor for automatic coercion of \a ac
565
+ PropCost(ActualCost ac);
566
+ public:
567
+ /// Exponential complexity for modifier \a m and size measure \a n
568
+ static PropCost crazy(PropCost::Mod m, unsigned int n);
569
+ /// Exponential complexity for modifier \a m and size measure \a n
570
+ static PropCost crazy(PropCost::Mod m, int n);
571
+ /// Cubic complexity for modifier \a m and size measure \a n
572
+ static PropCost cubic(PropCost::Mod m, unsigned int n);
573
+ /// Cubic complexity for modifier \a m and size measure \a n
574
+ static PropCost cubic(PropCost::Mod m, int n);
575
+ /// Quadratic complexity for modifier \a m and size measure \a n
576
+ static PropCost quadratic(PropCost::Mod m, unsigned int n);
577
+ /// Quadratic complexity for modifier \a m and size measure \a n
578
+ static PropCost quadratic(PropCost::Mod m, int n);
579
+ /// Linear complexity for modifier \a pcm and size measure \a n
580
+ static PropCost linear(PropCost::Mod m, unsigned int n);
581
+ /// Linear complexity for modifier \a pcm and size measure \a n
582
+ static PropCost linear(PropCost::Mod m, int n);
583
+ /// Three variables for modifier \a pcm
584
+ static PropCost ternary(PropCost::Mod m);
585
+ /// Two variables for modifier \a pcm
586
+ static PropCost binary(PropCost::Mod m);
587
+ /// Single variable for modifier \a pcm
588
+ static PropCost unary(PropCost::Mod m);
589
+ };
590
+
591
+
592
+ /**
593
+ * \brief Actor properties
594
+ * \ingroup TaskActor
595
+ */
596
+ enum ActorProperty {
597
+ /**
598
+ * \brief Actor must always be disposed
599
+ *
600
+ * Normally, a propagator will not be disposed if its home space
601
+ * is deleted. However, if an actor uses external resources,
602
+ * this property can be used to make sure that the actor
603
+ * will always be disposed.
604
+ */
605
+ AP_DISPOSE = (1 << 0),
606
+ /**
607
+ * Propagator is only weakly monotonic, that is, the propagator
608
+ * is only monotonic on assignments.
609
+ *
610
+ */
611
+ AP_WEAKLY = (1 << 1)
612
+ };
613
+
614
+
615
+ /**
616
+ * \brief Double-linked list for actors
617
+ *
618
+ * Used to maintain which actors belong to a space and also
619
+ * (for propagators) to organize actors in the queue of
620
+ * waiting propagators.
621
+ */
622
+ class ActorLink {
623
+ friend class Actor;
624
+ friend class Propagator;
625
+ friend class Advisor;
626
+ friend class Brancher;
627
+ friend class LocalObject;
628
+ friend class Space;
629
+ template<class VIC> friend class VarImp;
630
+ private:
631
+ ActorLink* _next; ActorLink* _prev;
632
+ public:
633
+ //@{
634
+ /// Routines for double-linked list
635
+ ActorLink* prev(void) const; void prev(ActorLink*);
636
+ ActorLink* next(void) const; void next(ActorLink*);
637
+ ActorLink** next_ref(void);
638
+ //@}
639
+
640
+ /// Initialize links (self-linked)
641
+ void init(void);
642
+ /// Remove from predecessor and successor
643
+ void unlink(void);
644
+ /// Insert \a al directly after this
645
+ void head(ActorLink* al);
646
+ /// Insert \a al directly before this
647
+ void tail(ActorLink* al);
648
+ /// Test whether actor link is empty (points to itself)
649
+ bool empty(void) const;
650
+ /// Static cast for a non-null pointer (to give a hint to optimizer)
651
+ template<class T> static ActorLink* cast(T* a);
652
+ /// Static cast for a non-null pointer (to give a hint to optimizer)
653
+ template<class T> static const ActorLink* cast(const T* a);
654
+ };
655
+
656
+
657
+ /**
658
+ * \brief Base-class for both propagators and branchers
659
+ * \ingroup TaskActor
660
+ */
661
+ class GECODE_VTABLE_EXPORT Actor : private ActorLink {
662
+ friend class ActorLink;
663
+ friend class Space;
664
+ friend class Propagator;
665
+ friend class Advisor;
666
+ friend class Brancher;
667
+ friend class LocalObject;
668
+ template<class VIC> friend class VarImp;
669
+ template<class A> friend class Council;
670
+ private:
671
+ /// Static cast for a non-null pointer (to give a hint to optimizer)
672
+ static Actor* cast(ActorLink* al);
673
+ /// Static cast for a non-null pointer (to give a hint to optimizer)
674
+ static const Actor* cast(const ActorLink* al);
675
+ public:
676
+ /// Create copy
677
+ virtual Actor* copy(Space& home, bool share) = 0;
678
+
679
+ /// \name Memory management
680
+ //@{
681
+ /// Report size occupied by additionally datastructures
682
+ GECODE_KERNEL_EXPORT
683
+ virtual size_t allocated(void) const;
684
+ /// Delete actor and return its size
685
+ GECODE_KERNEL_EXPORT
686
+ virtual size_t dispose(Space& home);
687
+ /// Allocate memory from space
688
+ static void* operator new(size_t s, Space& home);
689
+ /// No-op for exceptions
690
+ static void operator delete(void* p, Space& home);
691
+ private:
692
+ #ifndef __GNUC__
693
+ /// Not used (uses dispose instead)
694
+ static void operator delete(void* p);
695
+ #endif
696
+ /// Not used
697
+ static void* operator new(size_t s);
698
+ //@}
699
+ #ifdef __GNUC__
700
+ public:
701
+ /// To avoid warnings from GCC
702
+ GECODE_KERNEL_EXPORT virtual ~Actor(void);
703
+ /// Not used (uses dispose instead)
704
+ static void operator delete(void* p);
705
+ #endif
706
+ };
707
+
708
+
709
+
710
+ /**
711
+ * \brief %Home class for posting propagators
712
+ */
713
+ class Home {
714
+ protected:
715
+ /// The space where the propagator is to be posted
716
+ Space& s;
717
+ /// A propagator (possibly) that is currently being rewritten
718
+ Propagator* p;
719
+ public:
720
+ /// \name Conversion
721
+ //@{
722
+ /// Initialize the home with space \a s and propagator \a p
723
+ Home(Space& s, Propagator* p=NULL);
724
+ /// Retrieve the space of the home
725
+ operator Space&(void);
726
+ //@}
727
+ /// \name Extended information
728
+ //@{
729
+ /// Return a home extended by propagator to be rewritten
730
+ Home operator ()(Propagator& p);
731
+ /// Return propagator (or NULL) for currently rewritten propagator
732
+ Propagator* propagator(void) const;
733
+ //@}
734
+ /// \name Forwarding of common space operations
735
+ //@{
736
+ /// Check whether corresponding space is failed
737
+ bool failed(void) const;
738
+ /// Mark space as failed
739
+ void fail(void);
740
+ /// Notice actor property
741
+ void notice(Actor& a, ActorProperty p);
742
+ //@}
743
+ };
744
+
745
+ /**
746
+ * \brief Base-class for propagators
747
+ * \ingroup TaskActor
748
+ */
749
+ class GECODE_VTABLE_EXPORT Propagator : public Actor {
750
+ friend class ActorLink;
751
+ friend class Space;
752
+ template<class VIC> friend class VarImp;
753
+ friend class Advisor;
754
+ template<class A> friend class Council;
755
+ private:
756
+ union {
757
+ /// A set of modification events (used during propagation)
758
+ ModEventDelta med;
759
+ /// The size of the propagator (used during subsumption)
760
+ size_t size;
761
+ /// A list of advisors (used during cloning)
762
+ Gecode::ActorLink* advisors;
763
+ } u;
764
+ /// A reference to global propagator information
765
+ PropInfo& pi;
766
+ /// Static cast for a non-null pointer (to give a hint to optimizer)
767
+ static Propagator* cast(ActorLink* al);
768
+ /// Static cast for a non-null pointer (to give a hint to optimizer)
769
+ static const Propagator* cast(const ActorLink* al);
770
+ protected:
771
+ /// Constructor for posting
772
+ Propagator(Home home);
773
+ /// Constructor for cloning \a p
774
+ Propagator(Space& home, bool share, Propagator& p);
775
+
776
+ public:
777
+ /// \name Propagation
778
+ //@{
779
+ /**
780
+ * \brief Propagation function
781
+ *
782
+ * The propagation function must return an execution status as
783
+ * follows:
784
+ * - ES_FAILED: the propagator has detected failure
785
+ * - ES_NOFIX: the propagator has done propagation
786
+ * - ES_FIX: the propagator has done propagation and has computed
787
+ * a fixpoint. That is, running the propagator immediately
788
+ * again will do nothing.
789
+ *
790
+ * Apart from the above values, a propagator can return
791
+ * the result from calling one of the functions defined by a space:
792
+ * - ES_SUBSUMED: the propagator is subsumed and has been already
793
+ * deleted.
794
+ * - ES_NOFIX_PARTIAL: the propagator has consumed some of its
795
+ * propagation events.
796
+ * - ES_FIX_PARTIAL: the propagator has consumed some of its
797
+ * propagation events and with respect to these events is
798
+ * at fixpoint
799
+ * For more details, see the individual functions.
800
+ *
801
+ */
802
+ virtual ExecStatus propagate(Space& home, const ModEventDelta& med) = 0;
803
+ /// Cost function
804
+ virtual PropCost cost(const Space& home, const ModEventDelta& med) const = 0;
805
+ /**
806
+ * \brief Return the modification event delta
807
+ *
808
+ * This function returns the modification event delta of the currently
809
+ * executing propagator and hence can only be called within the
810
+ * propagate function of a propagator.
811
+ */
812
+ ModEventDelta modeventdelta(void) const;
813
+ /**
814
+ * \brief Advise function
815
+ *
816
+ * The advisor is passed as argument \a a.
817
+ *
818
+ * A propagator must specialize this advise function, if it
819
+ * uses advisors. The advise function must return an execution
820
+ * status as follows:
821
+ * - ES_FAILED: the advisor has detected failure.
822
+ * - ES_FIX: the advisor's propagator (that is, this propagator)
823
+ * does not need to be run.
824
+ * - ES_NOFIX: the advisor's propagator (that is, this propagator)
825
+ * must be run.
826
+ * - ES_NOFIX_FORCE: the advisor's propagator (that is, this propagator)
827
+ * must be run and it must forcefully be rescheduled (including
828
+ * recomputation of cost).
829
+ *
830
+ * Apart from the above values, an advisor can return
831
+ * the result from calling the function defined by a space:
832
+ * - ES_FIX_DISPOSE: the advisor's propagator does not need to be run
833
+ * and the advisor will be disposed.
834
+ * - ES_NOFIX_DISPOSE: the advisor's propagator must be run and the
835
+ * advisor will be disposed.
836
+ * - ES_NOFIX_FORCE_DISPOSE: the advisor's propagator must be run
837
+ * , it must forcefully be rescheduled (including recomputation
838
+ * of cost), and the adviser will be disposed.
839
+ * For more details, see the function documentation.
840
+ *
841
+ * The delta \a d describes how the variable has been changed
842
+ * by an operation on the advisor's variable. Typically,
843
+ * the delta information can only be utilized by either
844
+ * static or member functions of views as the actual delta
845
+ * information is both domain and view dependent.
846
+ *
847
+ */
848
+ GECODE_KERNEL_EXPORT
849
+ virtual ExecStatus advise(Space& home, Advisor& a, const Delta& d);
850
+ //@}
851
+ /// \name Information
852
+ //@{
853
+ /// Return the accumlated failure count
854
+ double afc(void) const;
855
+ //@}
856
+ };
857
+
858
+
859
+ /**
860
+ * \brief %Council of advisors
861
+ *
862
+ * If a propagator uses advisors, it must maintain its advisors
863
+ * through a council.
864
+ * \ingroup TaskActor
865
+ */
866
+ template<class A>
867
+ class Council {
868
+ friend class Advisor;
869
+ friend class Advisors<A>;
870
+ private:
871
+ /// Starting point for a linked list of advisors
872
+ mutable ActorLink* advisors;
873
+ public:
874
+ /// Default constructor
875
+ Council(void);
876
+ /// Construct advisor council
877
+ Council(Space& home);
878
+ /// Test whether council has advisor left
879
+ bool empty(void) const;
880
+ /// Update during cloning (copies all advisors)
881
+ void update(Space& home, bool share, Council<A>& c);
882
+ /// Dispose council
883
+ void dispose(Space& home);
884
+ };
885
+
886
+
887
+ /**
888
+ * \brief Class to iterate over advisors of a council
889
+ * \ingroup TaskActor
890
+ */
891
+ template<class A>
892
+ class Advisors {
893
+ private:
894
+ /// The current advisor
895
+ ActorLink* a;
896
+ public:
897
+ /// Initialize
898
+ Advisors(const Council<A>& c);
899
+ /// Test whether there advisors left
900
+ bool operator ()(void) const;
901
+ /// Move iterator to next advisor
902
+ void operator ++(void);
903
+ /// Return advisor
904
+ A& advisor(void) const;
905
+ };
906
+
907
+
908
+ /**
909
+ * \brief Base-class for advisors
910
+ *
911
+ * Advisors are typically subclassed for each propagator that
912
+ * wants to use advisors. The actual member function that
913
+ * is executed when a variable is changed, must be implemented
914
+ * by the advisor's propagator.
915
+ *
916
+ * \ingroup TaskActor
917
+ */
918
+ class Advisor : private ActorLink {
919
+ template<class VIC> friend class VarImp;
920
+ template<class A> friend class Council;
921
+ template<class A> friend class Advisors;
922
+ private:
923
+ /// Is the advisor disposed?
924
+ bool disposed(void) const;
925
+ /// Static cast
926
+ static Advisor* cast(ActorLink* al);
927
+ /// Static cast
928
+ static const Advisor* cast(const ActorLink* al);
929
+ protected:
930
+ /// Return the advisor's propagator
931
+ Propagator& propagator(void) const;
932
+ public:
933
+ /// Constructor for creation
934
+ template<class A>
935
+ Advisor(Space& home, Propagator& p, Council<A>& c);
936
+ /// Copying constructor
937
+ Advisor(Space& home, bool share, Advisor& a);
938
+
939
+ /// \name Memory management
940
+ //@{
941
+ /// Dispose the advisor
942
+ template<class A>
943
+ void dispose(Space& home, Council<A>& c);
944
+ /// Allocate memory from space
945
+ static void* operator new(size_t s, Space& home);
946
+ /// No-op for exceptions
947
+ static void operator delete(void* p, Space& home);
948
+ //@}
949
+ private:
950
+ #ifndef __GNUC__
951
+ /// Not used (uses dispose instead)
952
+ static void operator delete(void* p);
953
+ #endif
954
+ /// Not used
955
+ static void* operator new(size_t s);
956
+ };
957
+
958
+
959
+ class Brancher;
960
+ /**
961
+ * \brief %Choice for performing commit
962
+ *
963
+ * Must be refined by inheritance such that the information stored
964
+ * inside a choice is sufficient to redo a commit performed by a
965
+ * particular brancher.
966
+ *
967
+ * \ingroup TaskActor
968
+ */
969
+ class GECODE_VTABLE_EXPORT Choice {
970
+ friend class Space;
971
+ private:
972
+ unsigned int _id; ///< Identity to match creating brancher
973
+ unsigned int _alt; ///< Number of alternatives
974
+
975
+ /// Return id of the creating brancher
976
+ unsigned int id(void) const;
977
+ protected:
978
+ /// Initialize for particular brancher \a b and alternatives \a a
979
+ Choice(const Brancher& b, const unsigned int a);
980
+ public:
981
+ /// Return number of alternatives
982
+ unsigned int alternatives(void) const;
983
+ /// Destructor
984
+ GECODE_KERNEL_EXPORT virtual ~Choice(void);
985
+ /// Report size occupied by choice
986
+ virtual size_t size(void) const = 0;
987
+ /// Allocate memory from heap
988
+ static void* operator new(size_t);
989
+ /// Return memory to heap
990
+ static void operator delete(void*);
991
+ /// Archive into \a e
992
+ GECODE_KERNEL_EXPORT virtual void archive(Archive& e) const;
993
+ };
994
+
995
+ /**
996
+ * \brief Base-class for branchers
997
+ *
998
+ * Note that branchers cannot be created inside a propagator
999
+ * (no idea why one would like to do that anyway). If you do that
1000
+ * the system will explode in a truly interesting way.
1001
+ *
1002
+ * \ingroup TaskActor
1003
+ */
1004
+ class GECODE_VTABLE_EXPORT Brancher : public Actor {
1005
+ friend class ActorLink;
1006
+ friend class Space;
1007
+ friend class Choice;
1008
+ private:
1009
+ /// Unique identity
1010
+ unsigned int _id;
1011
+ /// Static cast for a non-null pointer (to give a hint to optimizer)
1012
+ static Brancher* cast(ActorLink* al);
1013
+ /// Static cast for a non-null pointer (to give a hint to optimizer)
1014
+ static const Brancher* cast(const ActorLink* al);
1015
+ protected:
1016
+ /// Constructor for creation
1017
+ Brancher(Home home);
1018
+ /// Constructor for cloning \a b
1019
+ Brancher(Space& home, bool share, Brancher& b);
1020
+ public:
1021
+ /// \name Brancher
1022
+ //@{
1023
+ /**
1024
+ * \brief Check status of brancher, return true if alternatives left
1025
+ *
1026
+ * This method is called when Space::status is called, it determines
1027
+ * whether to continue branching with this brancher or move on to
1028
+ * the (possibly) next brancher.
1029
+ *
1030
+ */
1031
+ virtual bool status(const Space& home) const = 0;
1032
+ /**
1033
+ * \brief Return choice
1034
+ *
1035
+ * Note that this method relies on the fact that it is called
1036
+ * immediately after a previous call to status. Moreover, the
1037
+ * member function can only be called once.
1038
+ */
1039
+ virtual const Choice* choice(Space& home) = 0;
1040
+ /// Return choice from \a e
1041
+ virtual const Choice* choice(const Space& home, Archive& e) = 0;
1042
+ /**
1043
+ * \brief Commit for choice \a c and alternative \a a
1044
+ *
1045
+ * The current brancher in the space \a home performs a commit from
1046
+ * the information provided by the choice \a c and the alternative \a a.
1047
+ */
1048
+ virtual ExecStatus commit(Space& home, const Choice& c,
1049
+ unsigned int a) = 0;
1050
+ /// Return unsigned brancher id
1051
+ unsigned int id(void) const;
1052
+ //@}
1053
+ };
1054
+
1055
+ /**
1056
+ * \brief Local (space-shared) object
1057
+ *
1058
+ * Local objects must inherit from this base class.
1059
+ *
1060
+ * \ingroup FuncSupportShared
1061
+ */
1062
+ class LocalObject : public Actor {
1063
+ friend class ActorLink;
1064
+ friend class Space;
1065
+ friend class LocalHandle;
1066
+ protected:
1067
+ /// Constructor for creation
1068
+ LocalObject(Home home);
1069
+ /// Copy constructor
1070
+ LocalObject(Space& home, bool share, LocalObject& l);
1071
+ /// Static cast for a non-null pointer (to give a hint to optimizer)
1072
+ static LocalObject* cast(ActorLink* al);
1073
+ /// Static cast for a non-null pointer (to give a hint to optimizer)
1074
+ static const LocalObject* cast(const ActorLink* al);
1075
+ private:
1076
+ /// Make copy and set forwarding pointer
1077
+ GECODE_KERNEL_EXPORT void fwdcopy(Space& home, bool share);
1078
+ public:
1079
+ /// Return forwarding pointer
1080
+ LocalObject* fwd(Space& home, bool share);
1081
+ };
1082
+
1083
+ /**
1084
+ * \brief Handles for local (space-shared) objects
1085
+ *
1086
+ * \ingroup FuncSupportShared
1087
+ *
1088
+ */
1089
+ class LocalHandle {
1090
+ private:
1091
+ /// The local object
1092
+ LocalObject* o;
1093
+ protected:
1094
+ /// Create local handle pointing to NULL object
1095
+ LocalHandle(void);
1096
+ /// Create local handle that points to local object \a lo
1097
+ LocalHandle(LocalObject* lo);
1098
+ /// Copy constructor
1099
+ LocalHandle(const LocalHandle& lh);
1100
+ public:
1101
+ /// Assignment operator
1102
+ LocalHandle& operator =(const LocalHandle& lh);
1103
+ /// Updating during cloning
1104
+ void update(Space& home, bool share, LocalHandle& lh);
1105
+ /// Destructor
1106
+ ~LocalHandle(void);
1107
+ protected:
1108
+ /// Access to the local object
1109
+ LocalObject* object(void) const;
1110
+ /// Modify local object
1111
+ void object(LocalObject* n);
1112
+ };
1113
+
1114
+
1115
+ /**
1116
+ * \brief %Space status
1117
+ * \ingroup TaskSearch
1118
+ */
1119
+ enum SpaceStatus {
1120
+ SS_FAILED, ///< %Space is failed
1121
+ SS_SOLVED, ///< %Space is solved (no brancher left)
1122
+ SS_BRANCH ///< %Space must be branched (at least one brancher left)
1123
+ };
1124
+
1125
+ /**
1126
+ * \brief %Statistics for execution of status
1127
+ *
1128
+ */
1129
+ class StatusStatistics {
1130
+ public:
1131
+ /// Number of propagator executions
1132
+ unsigned long int propagate;
1133
+ /// Whether a weakly monotonic propagator might have been executed
1134
+ bool wmp;
1135
+ /// Initialize
1136
+ StatusStatistics(void);
1137
+ /// Reset information
1138
+ void reset(void);
1139
+ /// Return sum with \a s
1140
+ StatusStatistics operator +(const StatusStatistics& s);
1141
+ /// Increment by statistics \a s
1142
+ StatusStatistics& operator +=(const StatusStatistics& s);
1143
+ };
1144
+
1145
+ /**
1146
+ * \brief %Statistics for execution of clone
1147
+ *
1148
+ */
1149
+ class CloneStatistics {
1150
+ public:
1151
+ /// Initialize
1152
+ CloneStatistics(void);
1153
+ /// Reset information
1154
+ void reset(void);
1155
+ /// Return sum with \a s
1156
+ CloneStatistics operator +(const CloneStatistics& s);
1157
+ /// Increment by statistics \a s
1158
+ CloneStatistics& operator +=(const CloneStatistics& s);
1159
+ };
1160
+
1161
+ /**
1162
+ * \brief %Statistics for execution of commit
1163
+ *
1164
+ */
1165
+ class CommitStatistics {
1166
+ public:
1167
+ /// Initialize
1168
+ CommitStatistics(void);
1169
+ /// Reset information
1170
+ void reset(void);
1171
+ /// Return sum with \a s
1172
+ CommitStatistics operator +(const CommitStatistics& s);
1173
+ /// Increment by statistics \a s
1174
+ CommitStatistics& operator +=(const CommitStatistics& s);
1175
+ };
1176
+
1177
+ /**
1178
+ * \brief Computation spaces
1179
+ */
1180
+ class GECODE_VTABLE_EXPORT Space {
1181
+ friend class Actor;
1182
+ friend class Propagator;
1183
+ friend class Brancher;
1184
+ friend class Advisor;
1185
+ template<class VIC> friend class VarImp;
1186
+ template<class VarImp> friend class VarImpDisposer;
1187
+ friend class SharedHandle;
1188
+ friend class LocalObject;
1189
+ friend class Region;
1190
+ private:
1191
+ /// Manager for shared memory areas
1192
+ SharedMemory* sm;
1193
+ /// Performs memory management for space
1194
+ MemoryManager mm;
1195
+ /// Global propagator information
1196
+ GlobalPropInfo gpi;
1197
+ /// Doubly linked list of all propagators
1198
+ ActorLink pl;
1199
+ /// Doubly linked list of all branchers
1200
+ ActorLink bl;
1201
+ /**
1202
+ * \brief Points to the first brancher to be used for status
1203
+ *
1204
+ * If equal to &bl, no brancher does exist.
1205
+ */
1206
+ Brancher* b_status;
1207
+ /**
1208
+ * \brief Points to the first brancher to be used for commit
1209
+ *
1210
+ * Note that \a b_commit can point to an earlier brancher
1211
+ * than \a b_status. This reflects the fact that the earlier
1212
+ * brancher is already done (that is, status on that brancher
1213
+ * returns false) but there might be still choices
1214
+ * referring to the earlier brancher.
1215
+ *
1216
+ * If equal to &bl, no brancher does exist.
1217
+ */
1218
+ Brancher* b_commit;
1219
+ union {
1220
+ /// Data only available during propagation
1221
+ struct {
1222
+ /**
1223
+ * \brief Cost level with next propagator to be executed
1224
+ *
1225
+ * This maintains the following invariant (but only if the
1226
+ * space does not perform propagation):
1227
+ * - If active points to a queue, this queue might contain
1228
+ * a propagator. However, there will be at least one queue
1229
+ * containing a propagator.
1230
+ * - Otherwise, active is smaller than the first queue
1231
+ * or larger than the last queue. Then, the space is stable.
1232
+ * - If active is larger than the last queue, the space is failed.
1233
+ */
1234
+ ActorLink* active;
1235
+ /// Scheduled propagators according to cost
1236
+ ActorLink queue[PropCost::AC_MAX+1];
1237
+ /// Id of next brancher to be created
1238
+ unsigned int branch_id;
1239
+ /// Number of subscriptions
1240
+ unsigned int n_sub;
1241
+ } p;
1242
+ /// Data available only during copying
1243
+ struct {
1244
+ /// Entries for updating variables
1245
+ VarImpBase* vars_u[AllVarConf::idx_c];
1246
+ /// Keep variables during copying without index structure
1247
+ VarImpBase* vars_noidx;
1248
+ /// Linked list of shared objects
1249
+ SharedHandle::Object* shared;
1250
+ /// Linked list of local objects
1251
+ LocalObject* local;
1252
+ } c;
1253
+ } pc;
1254
+ /// Put propagator \a p into right queue
1255
+ void enqueue(Propagator* p);
1256
+ /**
1257
+ * \name update, and dispose variables
1258
+ */
1259
+ //@{
1260
+ #ifdef GECODE_HAS_VAR_DISPOSE
1261
+ /// Registered variable type disposers
1262
+ GECODE_KERNEL_EXPORT static VarImpDisposerBase* vd[AllVarConf::idx_d];
1263
+ /// Entries for disposing variables
1264
+ VarImpBase* _vars_d[AllVarConf::idx_d];
1265
+ /// Return reference to variables (dispose)
1266
+ template<class VIC> VarImpBase* vars_d(void) const;
1267
+ /// Set reference to variables (dispose)
1268
+ template<class VIC> void vars_d(VarImpBase* x);
1269
+ #endif
1270
+ /// Update all cloned variables
1271
+ void update(ActorLink** sub);
1272
+ //@}
1273
+
1274
+ /// First actor for forced disposal
1275
+ Actor** d_fst;
1276
+ /// Current actor for forced disposal
1277
+ Actor** d_cur;
1278
+ /// Last actor for forced disposal
1279
+ Actor** d_lst;
1280
+ /// Resize disposal array
1281
+ GECODE_KERNEL_EXPORT void d_resize(void);
1282
+
1283
+ /**
1284
+ * \brief Number of weakly monotonic propagators
1285
+ *
1286
+ * If zero, none exists. If one, then none exists right now but
1287
+ * there has been one since the last fixpoint computed. Otherwise,
1288
+ * it gives the number of weakly monotoning propagators minus one.
1289
+ */
1290
+ unsigned int n_wmp;
1291
+
1292
+ /// Used for default argument
1293
+ GECODE_KERNEL_EXPORT static StatusStatistics unused_status;
1294
+ /// Used for default argument
1295
+ GECODE_KERNEL_EXPORT static CloneStatistics unused_clone;
1296
+ /// Used for default argument
1297
+ GECODE_KERNEL_EXPORT static CommitStatistics unused_commit;
1298
+ /// Used for default argument
1299
+ GECODE_KERNEL_EXPORT static unsigned long int unused_uli;
1300
+ /// Used for default arguments
1301
+ GECODE_KERNEL_EXPORT static bool unused_b;
1302
+
1303
+ /**
1304
+ * \brief Clone space
1305
+ *
1306
+ * Assumes that the space is stable and not failed. If the space is
1307
+ * failed, an exception of type SpaceFailed is thrown. If the space
1308
+ * is not stable, an exception of SpaceNotStable is thrown.
1309
+ *
1310
+ * Otherwise, a clone of the space is returned. If \a share is true,
1311
+ * sharable datastructures are shared among the clone and the original
1312
+ * space. If \a share is false, independent copies of the shared
1313
+ * datastructures must be created. This means that a clone with no
1314
+ * sharing can be used in a different thread without any interaction
1315
+ * with the original space.
1316
+ */
1317
+ GECODE_KERNEL_EXPORT Space* _clone(bool share=true);
1318
+
1319
+ /**
1320
+ * \brief Commit choice \a c for alternative \a a
1321
+ *
1322
+ * The current brancher in the space performs a commit from
1323
+ * the information provided by the choice \a c
1324
+ * and the alternative \a a. The statistics information \a stat is
1325
+ * updated.
1326
+ *
1327
+ * Note that no propagation is perfomed (to support path
1328
+ * recomputation), in order to perform propagation the member
1329
+ * function status must be used.
1330
+ *
1331
+ * Committing with choices must be carried
1332
+ * out in the same order as the choices have been
1333
+ * obtained by the member function Space::choice().
1334
+ *
1335
+ * It is perfectly okay to add constraints interleaved with
1336
+ * choices (provided they are in the right order).
1337
+ * However, if propagation is performed by calling the member
1338
+ * function status and then new choices are
1339
+ * computed, these choices are different.
1340
+ *
1341
+ * Only choices can be used that are up-to-date in the following
1342
+ * sense: if a new choice is created (via the choice member
1343
+ * function), no older choices can be used.
1344
+ *
1345
+ * Committing throws the following exceptions:
1346
+ * - SpaceNoBrancher, if the space has no current brancher (it is
1347
+ * already solved).
1348
+ * - SpaceIllegalAlternative, if \a a is not smaller than the number
1349
+ * of alternatives supported by the choice \a c.
1350
+ */
1351
+ GECODE_KERNEL_EXPORT
1352
+ void _commit(const Choice& c, unsigned int a);
1353
+
1354
+ public:
1355
+ /**
1356
+ * \brief Default constructor
1357
+ * \ingroup TaskModelScript
1358
+ */
1359
+ GECODE_KERNEL_EXPORT Space(void);
1360
+ /**
1361
+ * \brief Destructor
1362
+ * \ingroup TaskModelScript
1363
+ */
1364
+ GECODE_KERNEL_EXPORT virtual ~Space(void);
1365
+ /**
1366
+ * \brief Constructor for cloning
1367
+ *
1368
+ * Must copy and update all data structures (such as variables
1369
+ * and variable arrays) required by the subclass of Space.
1370
+ *
1371
+ * If \a share is true, share all data structures among copies.
1372
+ * Otherwise, make independent copies.
1373
+ * \ingroup TaskModelScript
1374
+ */
1375
+ GECODE_KERNEL_EXPORT Space(bool share, Space& s);
1376
+ /**
1377
+ * \brief Copying member function
1378
+ *
1379
+ * Must create a new object using the constructor for cloning.
1380
+ * \ingroup TaskModelScript
1381
+ */
1382
+ virtual Space* copy(bool share) = 0;
1383
+ /**
1384
+ * \brief Constrain function for best solution search
1385
+ *
1386
+ * Must constrain this space to be better than the so far best
1387
+ * solution \a best.
1388
+ *
1389
+ * If best solution search is used and this method is not redefined,
1390
+ * an exception of type SpaceConstrainUndefined is thrown.
1391
+ *
1392
+ * \ingroup TaskModelScript
1393
+ */
1394
+ GECODE_KERNEL_EXPORT virtual void constrain(const Space& best);
1395
+ /**
1396
+ * \brief Allocate memory from heap for new space
1397
+ * \ingroup TaskModelScript
1398
+ */
1399
+ static void* operator new(size_t);
1400
+ /**
1401
+ * \brief Free memory allocated from heap
1402
+ * \ingroup TaskModelScript
1403
+ */
1404
+ static void operator delete(void*);
1405
+
1406
+
1407
+ /*
1408
+ * Member functions for search engines
1409
+ *
1410
+ */
1411
+
1412
+ /**
1413
+ * \brief Query space status
1414
+ *
1415
+ * Propagates the space until fixpoint or failure;
1416
+ * updates the statistics information \a stat; and:
1417
+ * - if the space is failed, SpaceStatus::SS_FAILED is returned.
1418
+ * - if the space is not failed but the space has no brancher left,
1419
+ * SpaceStatus::SS_SOLVED is returned.
1420
+ * - otherwise, SpaceStatus::SS_BRANCH is returned.
1421
+ * \ingroup TaskSearch
1422
+ */
1423
+ GECODE_KERNEL_EXPORT
1424
+ SpaceStatus status(StatusStatistics& stat=unused_status);
1425
+
1426
+ /**
1427
+ * \brief Create new choice for current brancher
1428
+ *
1429
+ * This member function can only be called after the member function
1430
+ * Space::status on the same space has been called and in between
1431
+ * no non-const member function has been called on this space.
1432
+ *
1433
+ * Moreover, the member function can only be called at most once
1434
+ * (otherwise, it might generate conflicting choices).
1435
+ *
1436
+ * Note that the above invariant only pertains to calls of member
1437
+ * functions of the same space. If the invariant is violated, the
1438
+ * system is likely to crash (hopefully it does). In particular, if
1439
+ * applied to a space with no current brancher, the system will
1440
+ * crash.
1441
+ *
1442
+ * After a new choice has been created, no older choices
1443
+ * can be used on the space.
1444
+ *
1445
+ * If the status() member function has returned that the space has
1446
+ * no more branchers (that is, the result was either SS_FAILED or
1447
+ * SS_SOLVED), a call to choice() will return NULL and purge
1448
+ * all remaining branchers inside the space. This is interesting
1449
+ * for the case SS_SOLVED, where the call to choice can serve as
1450
+ * garbage collection.
1451
+ *
1452
+ * Throws an exception of type SpaceNotStable when applied to a not
1453
+ * yet stable space.
1454
+ *
1455
+ * \ingroup TaskSearch
1456
+ */
1457
+ GECODE_KERNEL_EXPORT
1458
+ const Choice* choice(void);
1459
+
1460
+ /**
1461
+ * \brief Create new choice from \a e
1462
+ *
1463
+ * The archived representation \a e must have been created from
1464
+ * a Choice that is compatible with this space (i.e., created from
1465
+ * the same model).
1466
+ *
1467
+ * \ingroup TaskSearch
1468
+ */
1469
+ GECODE_KERNEL_EXPORT
1470
+ const Choice* choice(Archive& e) const;
1471
+
1472
+ /**
1473
+ * \brief Clone space
1474
+ *
1475
+ * Assumes that the space is stable and not failed. If the space is
1476
+ * failed, an exception of type SpaceFailed is thrown. If the space
1477
+ * is not stable, an exception of SpaceNotStable is thrown.
1478
+ *
1479
+ * Otherwise, a clone of the space is returned and the statistics
1480
+ * information \a stat is updated. If \a share is true,
1481
+ * sharable datastructures are shared among the clone and the original
1482
+ * space. If \a share is false, independent copies of the shared
1483
+ * datastructures must be created. This means that a clone with no
1484
+ * sharing can be used in a different thread without any interaction
1485
+ * with the original space.
1486
+ *
1487
+ * \ingroup TaskSearch
1488
+ */
1489
+ Space* clone(bool share=true, CloneStatistics& stat=unused_clone) const;
1490
+
1491
+ /**
1492
+ * \brief Commit choice \a c for alternative \a a
1493
+ *
1494
+ * The current brancher in the space performs a commit from
1495
+ * the information provided by the choice \a c
1496
+ * and the alternative \a a. The statistics information \a stat is
1497
+ * updated.
1498
+ *
1499
+ * Note that no propagation is perfomed (to support path
1500
+ * recomputation), in order to perform propagation the member
1501
+ * function status must be used.
1502
+ *
1503
+ * Committing with choices must be carried
1504
+ * out in the same order as the choices have been
1505
+ * obtained by the member function Space::choice().
1506
+ *
1507
+ * It is perfectly okay to add constraints interleaved with
1508
+ * choices (provided they are in the right order).
1509
+ * However, if propagation is performed by calling the member
1510
+ * function status and then new choices are
1511
+ * computed, these choices are different.
1512
+ *
1513
+ * Only choices can be used that are up-to-date in the following
1514
+ * sense: if a new choice is created (via the choice member
1515
+ * function), no older choices can be used.
1516
+ *
1517
+ * Committing throws the following exceptions:
1518
+ * - SpaceNoBrancher, if the space has no current brancher (it is
1519
+ * already solved).
1520
+ * - SpaceIllegalAlternative, if \a a is not smaller than the number
1521
+ * of alternatives supported by the choice \a c.
1522
+ *
1523
+ * \ingroup TaskSearch
1524
+ */
1525
+ void commit(const Choice& c, unsigned int a,
1526
+ CommitStatistics& stat=unused_commit);
1527
+
1528
+ /**
1529
+ * \brief Notice actor property
1530
+ *
1531
+ * Make the space notice that the actor \a a has the property \a p.
1532
+ * Note that the same property can only be noticed once for an actor.
1533
+ * \ingroup TaskActor
1534
+ */
1535
+ void notice(Actor& a, ActorProperty p);
1536
+ /**
1537
+ * \brief Ignore actor property
1538
+ *
1539
+ * Make the space ignore that the actor \a a has the property \a p.
1540
+ * Note that a property must be ignored before an actor is disposed.
1541
+ * \ingroup TaskActor
1542
+ */
1543
+ void ignore(Actor& a, ActorProperty p);
1544
+
1545
+
1546
+ /**
1547
+ * \brief %Propagator \a p is subsumed
1548
+ *
1549
+ * First disposes the propagator and then returns subsumption.
1550
+ *
1551
+ * \warning Has a side-effect on the propagator. Overwrites
1552
+ * the modification event delta of a propagator.
1553
+ * Use only directly with returning from propagation.
1554
+ * \ingroup TaskActorStatus
1555
+ */
1556
+ ExecStatus ES_SUBSUMED(Propagator& p);
1557
+ /**
1558
+ * \brief %Propagator \a p is subsumed
1559
+ *
1560
+ * The size of the propagator is \a s.
1561
+ *
1562
+ * Note that the propagator must be subsumed and also disposed. So
1563
+ * in general, there should be code such as
1564
+ * \code return ES_SUBSUMED_DISPOSE(home,*this,dispose(home)) \endcode.
1565
+ *
1566
+ * \warning Has a side-effect on the propagator. Overwrites
1567
+ * the modification event delta of a propagator.
1568
+ * Use only directly with returning from propagation.
1569
+ * \ingroup TaskActorStatus
1570
+ */
1571
+ ExecStatus ES_SUBSUMED_DISPOSED(Propagator& p, size_t s);
1572
+ /**
1573
+ * \brief %Propagator \a p has computed partial fixpoint
1574
+ *
1575
+ * %Set modification event delta to \a med and schedule propagator
1576
+ * accordingly.
1577
+ *
1578
+ * \warning Has a side-effect on the propagator.
1579
+ * Use only directly with returning from propagation.
1580
+ * \ingroup TaskActorStatus
1581
+ */
1582
+ ExecStatus ES_FIX_PARTIAL(Propagator& p, const ModEventDelta& med);
1583
+ /**
1584
+ * \brief %Propagator \a p has not computed partial fixpoint
1585
+ *
1586
+ * Combine current modification event delta with \a and schedule
1587
+ * propagator accordingly.
1588
+ *
1589
+ * \warning Has a side-effect on the propagator.
1590
+ * Use only directly with returning from propagation.
1591
+ * \ingroup TaskActorStatus
1592
+ */
1593
+ ExecStatus ES_NOFIX_PARTIAL(Propagator& p, const ModEventDelta& med);
1594
+
1595
+ /**
1596
+ * \brief %Advisor \a a must be disposed
1597
+ *
1598
+ * Disposes the advisor and returns that the propagator of \a a
1599
+ * need not be run.
1600
+ *
1601
+ * \warning Has a side-effect on the advisor. Use only directly when
1602
+ * returning from advise.
1603
+ * \ingroup TaskActorStatus
1604
+ */
1605
+ template<class A>
1606
+ ExecStatus ES_FIX_DISPOSE(Council<A>& c, A& a);
1607
+ /**
1608
+ * \brief %Advisor \a a must be disposed and its propagator must be run
1609
+ *
1610
+ * Disposes the advisor and returns that the propagator of \a a
1611
+ * must be run.
1612
+ *
1613
+ * \warning Has a side-effect on the advisor. Use only directly when
1614
+ * returning from advise.
1615
+ * \ingroup TaskActorStatus
1616
+ */
1617
+ template<class A>
1618
+ ExecStatus ES_NOFIX_DISPOSE(Council<A>& c, A& a);
1619
+ /**
1620
+ * \brief %Advisor \a a must be disposed and its propagator must be forcefully rescheduled
1621
+ *
1622
+ * Disposes the advisor and returns that the propagator of \a a
1623
+ * must be run and must be forcefully rescheduled (including
1624
+ * recomputation of cost).
1625
+ *
1626
+ * \warning Has a side-effect on the advisor. Use only directly when
1627
+ * returning from advise.
1628
+ * \ingroup TaskActorStatus
1629
+ */
1630
+ template<class A>
1631
+ ExecStatus ES_NOFIX_DISPOSE_FORCE(Council<A>& c, A& a);
1632
+
1633
+ /**
1634
+ * \brief Fail space
1635
+ *
1636
+ * This is useful for failing outside of actors. Never use inside
1637
+ * a propagate or commit member function. The system will crash!
1638
+ * \ingroup TaskActor
1639
+ */
1640
+ void fail(void);
1641
+ /**
1642
+ * \brief Check whether space is failed
1643
+ *
1644
+ * Note that this does not perform propagation. This is useful
1645
+ * for posting actors: only if a space is not yet failed, new
1646
+ * actors are allowed to be created.
1647
+ * \ingroup TaskActor
1648
+ */
1649
+ bool failed(void) const;
1650
+ /**
1651
+ * \brief Return if space is stable (at fixpoint or failed)
1652
+ * \ingroup TaskActor
1653
+ */
1654
+ bool stable(void) const;
1655
+ /**
1656
+ * \brief Return number of propagators
1657
+ *
1658
+ * Note that this function takes linear time in the number of
1659
+ * propagators.
1660
+ */
1661
+ GECODE_KERNEL_EXPORT unsigned int propagators(void) const;
1662
+ /**
1663
+ * \brief Return number of branchers
1664
+ *
1665
+ * Note that this function takes linear time in the number of
1666
+ * branchers.
1667
+ */
1668
+ GECODE_KERNEL_EXPORT unsigned int branchers(void) const;
1669
+
1670
+ /// \name Conversion from Space to Home
1671
+ //@{
1672
+ /// Return a home for this space with the information that \a p is being rewritten
1673
+ Home operator ()(Propagator& p);
1674
+ //@}
1675
+
1676
+ /**
1677
+ * \defgroup FuncMemSpace Space-memory management
1678
+ * \ingroup FuncMem
1679
+ */
1680
+ //@{
1681
+ /**
1682
+ * \brief Allocate block of \a n objects of type \a T from space heap
1683
+ *
1684
+ * Note that this function implements C++ semantics: the default
1685
+ * constructor of \a T is run for all \a n objects.
1686
+ */
1687
+ template<class T>
1688
+ T* alloc(long unsigned int n);
1689
+ /**
1690
+ * \brief Allocate block of \a n objects of type \a T from space heap
1691
+ *
1692
+ * Note that this function implements C++ semantics: the default
1693
+ * constructor of \a T is run for all \a n objects.
1694
+ */
1695
+ template<class T>
1696
+ T* alloc(long int n);
1697
+ /**
1698
+ * \brief Allocate block of \a n objects of type \a T from space heap
1699
+ *
1700
+ * Note that this function implements C++ semantics: the default
1701
+ * constructor of \a T is run for all \a n objects.
1702
+ */
1703
+ template<class T>
1704
+ T* alloc(unsigned int n);
1705
+ /**
1706
+ * \brief Allocate block of \a n objects of type \a T from space heap
1707
+ *
1708
+ * Note that this function implements C++ semantics: the default
1709
+ * constructor of \a T is run for all \a n objects.
1710
+ */
1711
+ template<class T>
1712
+ T* alloc(int n);
1713
+ /**
1714
+ * \brief Delete \a n objects allocated from space heap starting at \a b
1715
+ *
1716
+ * Note that this function implements C++ semantics: the destructor
1717
+ * of \a T is run for all \a n objects.
1718
+ *
1719
+ * Note that the memory is not freed, it is just scheduled for later
1720
+ * reusal.
1721
+ */
1722
+ template<class T>
1723
+ void free(T* b, long unsigned int n);
1724
+ /**
1725
+ * \brief Delete \a n objects allocated from space heap starting at \a b
1726
+ *
1727
+ * Note that this function implements C++ semantics: the destructor
1728
+ * of \a T is run for all \a n objects.
1729
+ *
1730
+ * Note that the memory is not freed, it is just scheduled for later
1731
+ * reusal.
1732
+ */
1733
+ template<class T>
1734
+ void free(T* b, long int n);
1735
+ /**
1736
+ * \brief Delete \a n objects allocated from space heap starting at \a b
1737
+ *
1738
+ * Note that this function implements C++ semantics: the destructor
1739
+ * of \a T is run for all \a n objects.
1740
+ *
1741
+ * Note that the memory is not freed, it is just scheduled for later
1742
+ * reusal.
1743
+ */
1744
+ template<class T>
1745
+ void free(T* b, unsigned int n);
1746
+ /**
1747
+ * \brief Delete \a n objects allocated from space heap starting at \a b
1748
+ *
1749
+ * Note that this function implements C++ semantics: the destructor
1750
+ * of \a T is run for all \a n objects.
1751
+ *
1752
+ * Note that the memory is not freed, it is just scheduled for later
1753
+ * reusal.
1754
+ */
1755
+ template<class T>
1756
+ void free(T* b, int n);
1757
+ /**
1758
+ * \brief Reallocate block of \a n objects starting at \a b to \a m objects of type \a T from the space heap
1759
+ *
1760
+ * Note that this function implements C++ semantics: the copy constructor
1761
+ * of \a T is run for all \f$\min(n,m)\f$ objects, the default
1762
+ * constructor of \a T is run for all remaining
1763
+ * \f$\max(n,m)-\min(n,m)\f$ objects, and the destrucor of \a T is
1764
+ * run for all \a n objects in \a b.
1765
+ *
1766
+ * Returns the address of the new block.
1767
+ */
1768
+ template<class T>
1769
+ T* realloc(T* b, long unsigned int n, long unsigned int m);
1770
+ /**
1771
+ * \brief Reallocate block of \a n objects starting at \a b to \a m objects of type \a T from the space heap
1772
+ *
1773
+ * Note that this function implements C++ semantics: the copy constructor
1774
+ * of \a T is run for all \f$\min(n,m)\f$ objects, the default
1775
+ * constructor of \a T is run for all remaining
1776
+ * \f$\max(n,m)-\min(n,m)\f$ objects, and the destrucor of \a T is
1777
+ * run for all \a n objects in \a b.
1778
+ *
1779
+ * Returns the address of the new block.
1780
+ */
1781
+ template<class T>
1782
+ T* realloc(T* b, long int n, long int m);
1783
+ /**
1784
+ * \brief Reallocate block of \a n objects starting at \a b to \a m objects of type \a T from the space heap
1785
+ *
1786
+ * Note that this function implements C++ semantics: the copy constructor
1787
+ * of \a T is run for all \f$\min(n,m)\f$ objects, the default
1788
+ * constructor of \a T is run for all remaining
1789
+ * \f$\max(n,m)-\min(n,m)\f$ objects, and the destrucor of \a T is
1790
+ * run for all \a n objects in \a b.
1791
+ *
1792
+ * Returns the address of the new block.
1793
+ */
1794
+ template<class T>
1795
+ T* realloc(T* b, unsigned int n, unsigned int m);
1796
+ /**
1797
+ * \brief Reallocate block of \a n objects starting at \a b to \a m objects of type \a T from the space heap
1798
+ *
1799
+ * Note that this function implements C++ semantics: the copy constructor
1800
+ * of \a T is run for all \f$\min(n,m)\f$ objects, the default
1801
+ * constructor of \a T is run for all remaining
1802
+ * \f$\max(n,m)-\min(n,m)\f$ objects, and the destrucor of \a T is
1803
+ * run for all \a n objects in \a b.
1804
+ *
1805
+ * Returns the address of the new block.
1806
+ */
1807
+ template<class T>
1808
+ T* realloc(T* b, int n, int m);
1809
+ /**
1810
+ * \brief Reallocate block of \a n pointers starting at \a b to \a m objects of type \a T* from the space heap
1811
+ *
1812
+ * Returns the address of the new block.
1813
+ *
1814
+ * This is a specialization for performance.
1815
+ */
1816
+ template<class T>
1817
+ T** realloc(T** b, long unsigned int n, long unsigned int m);
1818
+ /**
1819
+ * \brief Reallocate block of \a n pointers starting at \a b to \a m objects of type \a T* from the space heap
1820
+ *
1821
+ * Returns the address of the new block.
1822
+ *
1823
+ * This is a specialization for performance.
1824
+ */
1825
+ template<class T>
1826
+ T** realloc(T** b, long int n, long int m);
1827
+ /**
1828
+ * \brief Reallocate block of \a n pointers starting at \a b to \a m objects of type \a T* from the space heap
1829
+ *
1830
+ * Returns the address of the new block.
1831
+ *
1832
+ * This is a specialization for performance.
1833
+ */
1834
+ template<class T>
1835
+ T** realloc(T** b, unsigned int n, unsigned int m);
1836
+ /**
1837
+ * \brief Reallocate block of \a n pointers starting at \a b to \a m objects of type \a T* from the space heap
1838
+ *
1839
+ * Returns the address of the new block.
1840
+ *
1841
+ * This is a specialization for performance.
1842
+ */
1843
+ template<class T>
1844
+ T** realloc(T** b, int n, int m);
1845
+ /// Allocate memory on space heap
1846
+ void* ralloc(size_t s);
1847
+ /// Free memory previously allocated with alloc (might be reused later)
1848
+ void rfree(void* p, size_t s);
1849
+ /// Reallocate memory block starting at \a b from size \a n to size \a s
1850
+ void* rrealloc(void* b, size_t n, size_t m);
1851
+ /// Allocate from freelist-managed memory
1852
+ template<size_t> void* fl_alloc(void);
1853
+ /**
1854
+ * \brief Return freelist-managed memory to freelist
1855
+ *
1856
+ * The first list element to be retuned is \a f, the last is \a l.
1857
+ */
1858
+ template<size_t> void fl_dispose(FreeList* f, FreeList* l);
1859
+ /**
1860
+ * \brief Return how much heap memory is allocated
1861
+ *
1862
+ * Note that is includes both the memory allocated for the space heap
1863
+ * as well as additional memory allocated by actors.
1864
+ */
1865
+ size_t allocated(void) const;
1866
+ /**
1867
+ * \brief Flush cached memory blocks and AFC information
1868
+ *
1869
+ * All spaces that are obtained as non-shared clones from some same space
1870
+ * try to cache memory blocks from failed spaces. To minimize memory
1871
+ * consumption, these blocks can be flushed.
1872
+ *
1873
+ * Also, the numbers for AFC are reset to zero.
1874
+ */
1875
+ GECODE_KERNEL_EXPORT void flush(void);
1876
+ //@}
1877
+ /// Construction routines
1878
+ //@{
1879
+ /**
1880
+ * \brief Constructs a single object of type \a T from space heap using the default constructor.
1881
+ */
1882
+ template<class T>
1883
+ T& construct(void);
1884
+ /**
1885
+ * \brief Constructs a single object of type \a T from space heap using a unary constructor.
1886
+ *
1887
+ * The parameter is passed as a const reference.
1888
+ */
1889
+ template<class T, typename A1>
1890
+ T& construct(A1 const& a1);
1891
+ /**
1892
+ * \brief Constructs a single object of type \a T from space heap using a binary constructor.
1893
+ *
1894
+ * The parameters are passed as const references.
1895
+ */
1896
+ template<class T, typename A1, typename A2>
1897
+ T& construct(A1 const& a1, A2 const& a2);
1898
+ /**
1899
+ * \brief Constructs a single object of type \a T from space heap using a ternary constructor.
1900
+ *
1901
+ * The parameters are passed as const references.
1902
+ */
1903
+ template<class T, typename A1, typename A2, typename A3>
1904
+ T& construct(A1 const& a1, A2 const& a2, A3 const& a3);
1905
+ /**
1906
+ * \brief Constructs a single object of type \a T from space heap using a quaternary constructor.
1907
+ *
1908
+ * The parameters are passed as const references.
1909
+ */
1910
+ template<class T, typename A1, typename A2, typename A3, typename A4>
1911
+ T& construct(A1 const& a1, A2 const& a2, A3 const& a3, A4 const& a4);
1912
+ /**
1913
+ * \brief Constructs a single object of type \a T from space heap using a quinary constructor.
1914
+ *
1915
+ * The parameters are passed as const references.
1916
+ */
1917
+ template<class T, typename A1, typename A2, typename A3, typename A4, typename A5>
1918
+ T& construct(A1 const& a1, A2 const& a2, A3 const& a3, A4 const& a4, A5 const& a5);
1919
+ //@}
1920
+
1921
+ /**
1922
+ * \brief Class to iterate over propagators of a space
1923
+ *
1924
+ * Note that the iterator cannot be used during cloning.
1925
+ */
1926
+ class Propagators {
1927
+ private:
1928
+ /// current space
1929
+ const Space& home;
1930
+ /// current queue
1931
+ const ActorLink* q;
1932
+ /// current propagator
1933
+ const ActorLink* c;
1934
+ /// end mark
1935
+ const ActorLink* e;
1936
+ public:
1937
+ /// Initialize
1938
+ Propagators(const Space& home);
1939
+ /// Test whether there are propagators left
1940
+ bool operator ()(void) const;
1941
+ /// Move iterator to next propagator
1942
+ void operator ++(void);
1943
+ /// Return propagator
1944
+ const Propagator& propagator(void) const;
1945
+ };
1946
+
1947
+ /**
1948
+ * \brief Class to iterate over branchers of a space
1949
+ *
1950
+ * Note that the iterator cannot be used during cloning.
1951
+ */
1952
+ class Branchers {
1953
+ private:
1954
+ /// current brancher
1955
+ const ActorLink* c;
1956
+ /// end mark
1957
+ const ActorLink* e;
1958
+ public:
1959
+ /// Initialize
1960
+ Branchers(const Space& home);
1961
+ /// Test whether there are branchers left
1962
+ bool operator ()(void) const;
1963
+ /// Move iterator to next brancher
1964
+ void operator ++(void);
1965
+ /// Return propagator
1966
+ const Brancher& brancher(void) const;
1967
+ };
1968
+ };
1969
+
1970
+
1971
+
1972
+
1973
+ /*
1974
+ * Memory management
1975
+ *
1976
+ */
1977
+
1978
+ // Heap allocated
1979
+ forceinline void*
1980
+ SharedHandle::Object::operator new(size_t s) {
1981
+ return heap.ralloc(s);
1982
+ }
1983
+ forceinline void
1984
+ SharedHandle::Object::operator delete(void* p) {
1985
+ heap.rfree(p);
1986
+ }
1987
+
1988
+ forceinline void*
1989
+ Space::operator new(size_t s) {
1990
+ return heap.ralloc(s);
1991
+ }
1992
+ forceinline void
1993
+ Space::operator delete(void* p) {
1994
+ heap.rfree(p);
1995
+ }
1996
+
1997
+ forceinline void
1998
+ Choice::operator delete(void* p) {
1999
+ heap.rfree(p);
2000
+ }
2001
+ forceinline void*
2002
+ Choice::operator new(size_t s) {
2003
+ return heap.ralloc(s);
2004
+ }
2005
+
2006
+ // Space allocation: general space heaps and free lists
2007
+ forceinline void*
2008
+ Space::ralloc(size_t s) {
2009
+ return mm.alloc(sm,s);
2010
+ }
2011
+ forceinline void
2012
+ Space::rfree(void* p, size_t s) {
2013
+ return mm.reuse(p,s);
2014
+ }
2015
+ forceinline void*
2016
+ Space::rrealloc(void* _b, size_t n, size_t m) {
2017
+ char* b = static_cast<char*>(_b);
2018
+ if (n < m) {
2019
+ char* p = static_cast<char*>(ralloc(m));
2020
+ memcpy(p,b,n);
2021
+ rfree(b,n);
2022
+ return p;
2023
+ } else {
2024
+ rfree(b+m,m-n);
2025
+ return b;
2026
+ }
2027
+ }
2028
+
2029
+ template<size_t s>
2030
+ forceinline void*
2031
+ Space::fl_alloc(void) {
2032
+ return mm.template fl_alloc<s>(sm);
2033
+ }
2034
+ template<size_t s>
2035
+ forceinline void
2036
+ Space::fl_dispose(FreeList* f, FreeList* l) {
2037
+ mm.template fl_dispose<s>(f,l);
2038
+ }
2039
+
2040
+ forceinline size_t
2041
+ Space::allocated(void) const {
2042
+ size_t s = mm.allocated();
2043
+ for (Actor** a = d_fst; a < d_cur; a++)
2044
+ s += (*a)->allocated();
2045
+ return s;
2046
+ }
2047
+
2048
+ /*
2049
+ * Typed allocation routines
2050
+ *
2051
+ */
2052
+ template<class T>
2053
+ forceinline T*
2054
+ Space::alloc(long unsigned int n) {
2055
+ T* p = static_cast<T*>(ralloc(sizeof(T)*n));
2056
+ for (long unsigned int i=n; i--; )
2057
+ (void) new (p+i) T();
2058
+ return p;
2059
+ }
2060
+ template<class T>
2061
+ forceinline T*
2062
+ Space::alloc(long int n) {
2063
+ assert(n >= 0);
2064
+ return alloc<T>(static_cast<long unsigned int>(n));
2065
+ }
2066
+ template<class T>
2067
+ forceinline T*
2068
+ Space::alloc(unsigned int n) {
2069
+ return alloc<T>(static_cast<long unsigned int>(n));
2070
+ }
2071
+ template<class T>
2072
+ forceinline T*
2073
+ Space::alloc(int n) {
2074
+ assert(n >= 0);
2075
+ return alloc<T>(static_cast<long unsigned int>(n));
2076
+ }
2077
+
2078
+ template<class T>
2079
+ forceinline void
2080
+ Space::free(T* b, long unsigned int n) {
2081
+ for (long unsigned int i=n; i--; )
2082
+ b[i].~T();
2083
+ rfree(b,n*sizeof(T));
2084
+ }
2085
+ template<class T>
2086
+ forceinline void
2087
+ Space::free(T* b, long int n) {
2088
+ assert(n >= 0);
2089
+ free<T>(b,static_cast<long unsigned int>(n));
2090
+ }
2091
+ template<class T>
2092
+ forceinline void
2093
+ Space::free(T* b, unsigned int n) {
2094
+ free<T>(b,static_cast<long unsigned int>(n));
2095
+ }
2096
+ template<class T>
2097
+ forceinline void
2098
+ Space::free(T* b, int n) {
2099
+ assert(n >= 0);
2100
+ free<T>(b,static_cast<long unsigned int>(n));
2101
+ }
2102
+
2103
+ template<class T>
2104
+ forceinline T*
2105
+ Space::realloc(T* b, long unsigned int n, long unsigned int m) {
2106
+ if (n < m) {
2107
+ T* p = static_cast<T*>(ralloc(sizeof(T)*m));
2108
+ for (long unsigned int i=n; i--; )
2109
+ (void) new (p+i) T(b[i]);
2110
+ for (long unsigned int i=n; i<m; i++)
2111
+ (void) new (p+i) T();
2112
+ free<T>(b,n);
2113
+ return p;
2114
+ } else {
2115
+ free<T>(b+m,m-n);
2116
+ return b;
2117
+ }
2118
+ }
2119
+ template<class T>
2120
+ forceinline T*
2121
+ Space::realloc(T* b, long int n, long int m) {
2122
+ assert((n >= 0) && (m >= 0));
2123
+ return realloc<T>(b,static_cast<long unsigned int>(n),
2124
+ static_cast<long unsigned int>(m));
2125
+ }
2126
+ template<class T>
2127
+ forceinline T*
2128
+ Space::realloc(T* b, unsigned int n, unsigned int m) {
2129
+ return realloc<T>(b,static_cast<long unsigned int>(n),
2130
+ static_cast<long unsigned int>(m));
2131
+ }
2132
+ template<class T>
2133
+ forceinline T*
2134
+ Space::realloc(T* b, int n, int m) {
2135
+ assert((n >= 0) && (m >= 0));
2136
+ return realloc<T>(b,static_cast<long unsigned int>(n),
2137
+ static_cast<long unsigned int>(m));
2138
+ }
2139
+
2140
+ #define GECODE_KERNEL_REALLOC(T) \
2141
+ template<> \
2142
+ forceinline T* \
2143
+ Space::realloc<T>(T* b, long unsigned int n, long unsigned int m) { \
2144
+ return static_cast<T*>(rrealloc(b,n*sizeof(T),m*sizeof(T))); \
2145
+ } \
2146
+ template<> \
2147
+ forceinline T* \
2148
+ Space::realloc<T>(T* b, long int n, long int m) { \
2149
+ assert((n >= 0) && (m >= 0)); \
2150
+ return realloc<T>(b,static_cast<long unsigned int>(n), \
2151
+ static_cast<long unsigned int>(m)); \
2152
+ } \
2153
+ template<> \
2154
+ forceinline T* \
2155
+ Space::realloc<T>(T* b, unsigned int n, unsigned int m) { \
2156
+ return realloc<T>(b,static_cast<long unsigned int>(n), \
2157
+ static_cast<long unsigned int>(m)); \
2158
+ } \
2159
+ template<> \
2160
+ forceinline T* \
2161
+ Space::realloc<T>(T* b, int n, int m) { \
2162
+ assert((n >= 0) && (m >= 0)); \
2163
+ return realloc<T>(b,static_cast<long unsigned int>(n), \
2164
+ static_cast<long unsigned int>(m)); \
2165
+ }
2166
+
2167
+ GECODE_KERNEL_REALLOC(bool)
2168
+ GECODE_KERNEL_REALLOC(signed char)
2169
+ GECODE_KERNEL_REALLOC(unsigned char)
2170
+ GECODE_KERNEL_REALLOC(signed short int)
2171
+ GECODE_KERNEL_REALLOC(unsigned short int)
2172
+ GECODE_KERNEL_REALLOC(signed int)
2173
+ GECODE_KERNEL_REALLOC(unsigned int)
2174
+ GECODE_KERNEL_REALLOC(signed long int)
2175
+ GECODE_KERNEL_REALLOC(unsigned long int)
2176
+ GECODE_KERNEL_REALLOC(float)
2177
+ GECODE_KERNEL_REALLOC(double)
2178
+
2179
+ #undef GECODE_KERNEL_REALLOC
2180
+
2181
+ template<class T>
2182
+ forceinline T**
2183
+ Space::realloc(T** b, long unsigned int n, long unsigned int m) {
2184
+ return static_cast<T**>(rrealloc(b,n*sizeof(T),m*sizeof(T*)));
2185
+ }
2186
+ template<class T>
2187
+ forceinline T**
2188
+ Space::realloc(T** b, long int n, long int m) {
2189
+ assert((n >= 0) && (m >= 0));
2190
+ return realloc<T*>(b,static_cast<long unsigned int>(n),
2191
+ static_cast<long unsigned int>(m));
2192
+ }
2193
+ template<class T>
2194
+ forceinline T**
2195
+ Space::realloc(T** b, unsigned int n, unsigned int m) {
2196
+ return realloc<T*>(b,static_cast<long unsigned int>(n),
2197
+ static_cast<long unsigned int>(m));
2198
+ }
2199
+ template<class T>
2200
+ forceinline T**
2201
+ Space::realloc(T** b, int n, int m) {
2202
+ assert((n >= 0) && (m >= 0));
2203
+ return realloc<T*>(b,static_cast<long unsigned int>(n),
2204
+ static_cast<long unsigned int>(m));
2205
+ }
2206
+
2207
+
2208
+ #ifdef GECODE_HAS_VAR_DISPOSE
2209
+ template<class VIC>
2210
+ forceinline VarImpBase*
2211
+ Space::vars_d(void) const {
2212
+ return _vars_d[VIC::idx_d];
2213
+ }
2214
+ template<class VIC>
2215
+ forceinline void
2216
+ Space::vars_d(VarImpBase* x) {
2217
+ _vars_d[VIC::idx_d] = x;
2218
+ }
2219
+ #endif
2220
+
2221
+ // Space allocated entities: Actors, variable implementations, and advisors
2222
+ forceinline void
2223
+ Actor::operator delete(void*) {}
2224
+ forceinline void
2225
+ Actor::operator delete(void*, Space&) {}
2226
+ forceinline void*
2227
+ Actor::operator new(size_t s, Space& home) {
2228
+ return home.ralloc(s);
2229
+ }
2230
+
2231
+ template<class VIC>
2232
+ forceinline void
2233
+ VarImp<VIC>::operator delete(void*) {}
2234
+ template<class VIC>
2235
+ forceinline void
2236
+ VarImp<VIC>::operator delete(void*, Space&) {}
2237
+ template<class VIC>
2238
+ forceinline void*
2239
+ VarImp<VIC>::operator new(size_t s, Space& home) {
2240
+ return home.ralloc(s);
2241
+ }
2242
+
2243
+ #ifndef __GNUC__
2244
+ forceinline void
2245
+ Advisor::operator delete(void*) {}
2246
+ #endif
2247
+ forceinline void
2248
+ Advisor::operator delete(void*, Space&) {}
2249
+ forceinline void*
2250
+ Advisor::operator new(size_t s, Space& home) {
2251
+ return home.ralloc(s);
2252
+ }
2253
+
2254
+ /*
2255
+ * Shared objects and handles
2256
+ *
2257
+ */
2258
+ forceinline
2259
+ SharedHandle::Object::Object(void)
2260
+ : next(NULL), fwd(NULL), use_cnt(0) {}
2261
+ forceinline
2262
+ SharedHandle::Object::~Object(void) {
2263
+ assert(use_cnt == 0);
2264
+ }
2265
+
2266
+ forceinline SharedHandle::Object*
2267
+ SharedHandle::object(void) const {
2268
+ return o;
2269
+ }
2270
+ forceinline void
2271
+ SharedHandle::subscribe(void) {
2272
+ if (o != NULL) o->use_cnt++;
2273
+ }
2274
+ forceinline void
2275
+ SharedHandle::cancel(void) {
2276
+ if ((o != NULL) && (--o->use_cnt == 0))
2277
+ delete o;
2278
+ o=NULL;
2279
+ }
2280
+ forceinline void
2281
+ SharedHandle::object(SharedHandle::Object* n) {
2282
+ if (n != o) {
2283
+ cancel(); o=n; subscribe();
2284
+ }
2285
+ }
2286
+ forceinline
2287
+ SharedHandle::SharedHandle(void) : o(NULL) {}
2288
+ forceinline
2289
+ SharedHandle::SharedHandle(SharedHandle::Object* so) : o(so) {
2290
+ subscribe();
2291
+ }
2292
+ forceinline
2293
+ SharedHandle::SharedHandle(const SharedHandle& sh) : o(sh.o) {
2294
+ subscribe();
2295
+ }
2296
+ forceinline SharedHandle&
2297
+ SharedHandle::operator =(const SharedHandle& sh) {
2298
+ if (&sh != this) {
2299
+ cancel(); o=sh.o; subscribe();
2300
+ }
2301
+ return *this;
2302
+ }
2303
+ forceinline void
2304
+ SharedHandle::update(Space& home, bool share, SharedHandle& sh) {
2305
+ if (sh.o == NULL) {
2306
+ o=NULL; return;
2307
+ } else if (share) {
2308
+ o=sh.o;
2309
+ } else if (sh.o->fwd != NULL) {
2310
+ o=sh.o->fwd;
2311
+ } else {
2312
+ o = sh.o->copy();
2313
+ sh.o->fwd = o;
2314
+ sh.o->next = home.pc.c.shared;
2315
+ home.pc.c.shared = sh.o;
2316
+ }
2317
+ subscribe();
2318
+ }
2319
+ forceinline
2320
+ SharedHandle::~SharedHandle(void) {
2321
+ cancel();
2322
+ }
2323
+
2324
+
2325
+
2326
+ /*
2327
+ * ActorLink
2328
+ *
2329
+ */
2330
+ forceinline ActorLink*
2331
+ ActorLink::prev(void) const {
2332
+ return _prev;
2333
+ }
2334
+
2335
+ forceinline ActorLink*
2336
+ ActorLink::next(void) const {
2337
+ return _next;
2338
+ }
2339
+
2340
+ forceinline ActorLink**
2341
+ ActorLink::next_ref(void) {
2342
+ return &_next;
2343
+ }
2344
+
2345
+ forceinline void
2346
+ ActorLink::prev(ActorLink* al) {
2347
+ _prev = al;
2348
+ }
2349
+
2350
+ forceinline void
2351
+ ActorLink::next(ActorLink* al) {
2352
+ _next = al;
2353
+ }
2354
+
2355
+ forceinline void
2356
+ ActorLink::unlink(void) {
2357
+ ActorLink* p = _prev; ActorLink* n = _next;
2358
+ p->_next = n; n->_prev = p;
2359
+ }
2360
+
2361
+ forceinline void
2362
+ ActorLink::init(void) {
2363
+ _next = this; _prev =this;
2364
+ }
2365
+
2366
+ forceinline void
2367
+ ActorLink::head(ActorLink* a) {
2368
+ // Inserts al at head of link-chain (that is, after this)
2369
+ ActorLink* n = _next;
2370
+ this->_next = a; a->_prev = this;
2371
+ a->_next = n; n->_prev = a;
2372
+ }
2373
+
2374
+ forceinline void
2375
+ ActorLink::tail(ActorLink* a) {
2376
+ // Inserts al at tail of link-chain (that is, before this)
2377
+ ActorLink* p = _prev;
2378
+ a->_next = this; this->_prev = a;
2379
+ p->_next = a; a->_prev = p;
2380
+ }
2381
+
2382
+ forceinline bool
2383
+ ActorLink::empty(void) const {
2384
+ return _next == this;
2385
+ }
2386
+
2387
+ template<class T>
2388
+ forceinline ActorLink*
2389
+ ActorLink::cast(T* a) {
2390
+ // Turning al into a reference is for gcc, assume is for MSVC
2391
+ GECODE_NOT_NULL(a);
2392
+ ActorLink& t = *a;
2393
+ return static_cast<ActorLink*>(&t);
2394
+ }
2395
+
2396
+ template<class T>
2397
+ forceinline const ActorLink*
2398
+ ActorLink::cast(const T* a) {
2399
+ // Turning al into a reference is for gcc, assume is for MSVC
2400
+ GECODE_NOT_NULL(a);
2401
+ const ActorLink& t = *a;
2402
+ return static_cast<const ActorLink*>(&t);
2403
+ }
2404
+
2405
+
2406
+ /*
2407
+ * Actor
2408
+ *
2409
+ */
2410
+ forceinline Actor*
2411
+ Actor::cast(ActorLink* al) {
2412
+ // Turning al into a reference is for gcc, assume is for MSVC
2413
+ GECODE_NOT_NULL(al);
2414
+ ActorLink& t = *al;
2415
+ return static_cast<Actor*>(&t);
2416
+ }
2417
+
2418
+ forceinline const Actor*
2419
+ Actor::cast(const ActorLink* al) {
2420
+ // Turning al into a reference is for gcc, assume is for MSVC
2421
+ GECODE_NOT_NULL(al);
2422
+ const ActorLink& t = *al;
2423
+ return static_cast<const Actor*>(&t);
2424
+ }
2425
+
2426
+ forceinline void
2427
+ Space::notice(Actor& a, ActorProperty p) {
2428
+ if (p & AP_DISPOSE) {
2429
+ if (d_cur == d_lst)
2430
+ d_resize();
2431
+ *(d_cur++) = &a;
2432
+ }
2433
+ if (p & AP_WEAKLY) {
2434
+ if (n_wmp == 0)
2435
+ n_wmp = 2;
2436
+ else
2437
+ n_wmp++;
2438
+ }
2439
+ }
2440
+
2441
+ forceinline void
2442
+ Home::notice(Actor& a, ActorProperty p) {
2443
+ s.notice(a,p);
2444
+ }
2445
+
2446
+ forceinline void
2447
+ Space::ignore(Actor& a, ActorProperty p) {
2448
+ if (p & AP_DISPOSE) {
2449
+ // Check wether array has already been discarded as space
2450
+ // deletion is already in progress
2451
+ Actor** f = d_fst;
2452
+ if (f != NULL) {
2453
+ while (&a != *f)
2454
+ f++;
2455
+ *f = *(--d_cur);
2456
+ }
2457
+ }
2458
+ if (p & AP_WEAKLY) {
2459
+ assert(n_wmp > 1);
2460
+ n_wmp--;
2461
+ }
2462
+ }
2463
+
2464
+ forceinline Space*
2465
+ Space::clone(bool share, CloneStatistics&) const {
2466
+ // Clone is only const for search engines. During cloning, several data
2467
+ // structures are updated (e.g. forwarding pointers), so we have to
2468
+ // cast away the constness.
2469
+ return const_cast<Space*>(this)->_clone(share);
2470
+ }
2471
+
2472
+ forceinline void
2473
+ Space::commit(const Choice& c, unsigned int a, CommitStatistics&) {
2474
+ _commit(c,a);
2475
+ }
2476
+
2477
+ forceinline size_t
2478
+ Actor::dispose(Space&) {
2479
+ return sizeof(*this);
2480
+ }
2481
+
2482
+
2483
+ /*
2484
+ * Home for posting actors
2485
+ *
2486
+ */
2487
+ forceinline
2488
+ Home::Home(Space& s0, Propagator* p0) : s(s0), p(p0) {}
2489
+ forceinline
2490
+ Home::operator Space&(void) {
2491
+ return s;
2492
+ }
2493
+ forceinline Home
2494
+ Home::operator ()(Propagator& p) {
2495
+ return Home(s,&p);
2496
+ }
2497
+ forceinline Home
2498
+ Space::operator ()(Propagator& p) {
2499
+ return Home(*this,&p);
2500
+ }
2501
+ forceinline Propagator*
2502
+ Home::propagator(void) const {
2503
+ return p;
2504
+ }
2505
+
2506
+ /*
2507
+ * Propagator
2508
+ *
2509
+ */
2510
+ forceinline Propagator*
2511
+ Propagator::cast(ActorLink* al) {
2512
+ // Turning al into a reference is for gcc, assume is for MSVC
2513
+ GECODE_NOT_NULL(al);
2514
+ ActorLink& t = *al;
2515
+ return static_cast<Propagator*>(&t);
2516
+ }
2517
+
2518
+ forceinline const Propagator*
2519
+ Propagator::cast(const ActorLink* al) {
2520
+ // Turning al into a reference is for gcc, assume is for MSVC
2521
+ GECODE_NOT_NULL(al);
2522
+ const ActorLink& t = *al;
2523
+ return static_cast<const Propagator*>(&t);
2524
+ }
2525
+
2526
+ forceinline
2527
+ Propagator::Propagator(Home home)
2528
+ : pi((home.propagator() != NULL) ?
2529
+ // Inherit propagator information
2530
+ home.propagator()->pi :
2531
+ // New propagator information
2532
+ static_cast<Space&>(home).gpi.allocate()) {
2533
+ u.advisors = NULL;
2534
+ assert((u.med == 0) && (u.size == 0));
2535
+ static_cast<Space&>(home).pl.head(this);
2536
+ }
2537
+
2538
+ forceinline
2539
+ Propagator::Propagator(Space&, bool, Propagator& p)
2540
+ : pi(p.pi) {
2541
+ u.advisors = NULL;
2542
+ assert((u.med == 0) && (u.size == 0));
2543
+ // Set forwarding pointer
2544
+ p.prev(this);
2545
+ }
2546
+
2547
+ forceinline ModEventDelta
2548
+ Propagator::modeventdelta(void) const {
2549
+ return u.med;
2550
+ }
2551
+
2552
+ forceinline double
2553
+ Propagator::afc(void) const {
2554
+ return pi.afc();
2555
+ }
2556
+
2557
+ forceinline ExecStatus
2558
+ Space::ES_SUBSUMED_DISPOSED(Propagator& p, size_t s) {
2559
+ p.u.size = s;
2560
+ return __ES_SUBSUMED;
2561
+ }
2562
+
2563
+ forceinline ExecStatus
2564
+ Space::ES_SUBSUMED(Propagator& p) {
2565
+ p.u.size = p.dispose(*this);
2566
+ return __ES_SUBSUMED;
2567
+ }
2568
+
2569
+ forceinline ExecStatus
2570
+ Space::ES_FIX_PARTIAL(Propagator& p, const ModEventDelta& med) {
2571
+ p.u.med = med;
2572
+ assert(p.u.med != 0);
2573
+ return __ES_PARTIAL;
2574
+ }
2575
+
2576
+ forceinline ExecStatus
2577
+ Space::ES_NOFIX_PARTIAL(Propagator& p, const ModEventDelta& med) {
2578
+ p.u.med = AllVarConf::med_combine(p.u.med,med);
2579
+ assert(p.u.med != 0);
2580
+ return __ES_PARTIAL;
2581
+ }
2582
+
2583
+
2584
+
2585
+ /*
2586
+ * Brancher
2587
+ *
2588
+ */
2589
+ forceinline Brancher*
2590
+ Brancher::cast(ActorLink* al) {
2591
+ // Turning al into a reference is for gcc, assume is for MSVC
2592
+ GECODE_NOT_NULL(al);
2593
+ ActorLink& t = *al;
2594
+ return static_cast<Brancher*>(&t);
2595
+ }
2596
+
2597
+ forceinline const Brancher*
2598
+ Brancher::cast(const ActorLink* al) {
2599
+ // Turning al into a reference is for gcc, assume is for MSVC
2600
+ GECODE_NOT_NULL(al);
2601
+ const ActorLink& t = *al;
2602
+ return static_cast<const Brancher*>(&t);
2603
+ }
2604
+
2605
+ forceinline
2606
+ Brancher::Brancher(Home home) :
2607
+ _id(static_cast<Space&>(home).pc.p.branch_id++) {
2608
+ if (static_cast<Space&>(home).pc.p.branch_id == 0U)
2609
+ throw TooManyBranchers("Brancher::Brancher");
2610
+ // If no brancher available, make it the first one
2611
+ if (static_cast<Space&>(home).b_status == &static_cast<Space&>(home).bl) {
2612
+ static_cast<Space&>(home).b_status = this;
2613
+ if (static_cast<Space&>(home).b_commit == &static_cast<Space&>(home).bl)
2614
+ static_cast<Space&>(home).b_commit = this;
2615
+ }
2616
+ static_cast<Space&>(home).bl.tail(this);
2617
+ }
2618
+
2619
+ forceinline
2620
+ Brancher::Brancher(Space&, bool, Brancher& b)
2621
+ : _id(b._id) {
2622
+ // Set forwarding pointer
2623
+ b.prev(this);
2624
+ }
2625
+
2626
+ forceinline unsigned int
2627
+ Brancher::id(void) const {
2628
+ return _id;
2629
+ }
2630
+
2631
+ /*
2632
+ * Local objects
2633
+ *
2634
+ */
2635
+
2636
+ forceinline LocalObject*
2637
+ LocalObject::cast(ActorLink* al) {
2638
+ // Turning al into a reference is for gcc, assume is for MSVC
2639
+ GECODE_NOT_NULL(al);
2640
+ ActorLink& t = *al;
2641
+ return static_cast<LocalObject*>(&t);
2642
+ }
2643
+
2644
+ forceinline const LocalObject*
2645
+ LocalObject::cast(const ActorLink* al) {
2646
+ // Turning al into a reference is for gcc, assume is for MSVC
2647
+ GECODE_NOT_NULL(al);
2648
+ const ActorLink& t = *al;
2649
+ return static_cast<const LocalObject*>(&t);
2650
+ }
2651
+
2652
+ forceinline
2653
+ LocalObject::LocalObject(Home) {
2654
+ ActorLink::cast(this)->prev(NULL);
2655
+ }
2656
+
2657
+ forceinline
2658
+ LocalObject::LocalObject(Space&,bool,LocalObject&) {
2659
+ ActorLink::cast(this)->prev(NULL);
2660
+ }
2661
+
2662
+ forceinline LocalObject*
2663
+ LocalObject::fwd(Space& home, bool share) {
2664
+ if (prev() == NULL)
2665
+ fwdcopy(home,share);
2666
+ return LocalObject::cast(prev());
2667
+ }
2668
+
2669
+ forceinline
2670
+ LocalHandle::LocalHandle(void) : o(NULL) {}
2671
+ forceinline
2672
+ LocalHandle::LocalHandle(LocalObject* lo) : o(lo) {}
2673
+ forceinline
2674
+ LocalHandle::LocalHandle(const LocalHandle& lh) : o(lh.o) {}
2675
+ forceinline LocalHandle&
2676
+ LocalHandle::operator =(const LocalHandle& lh) {
2677
+ o = lh.o;
2678
+ return *this;
2679
+ }
2680
+ forceinline
2681
+ LocalHandle::~LocalHandle(void) {}
2682
+ forceinline LocalObject*
2683
+ LocalHandle::object(void) const { return o; }
2684
+ forceinline void
2685
+ LocalHandle::object(LocalObject* n) { o = n; }
2686
+ forceinline void
2687
+ LocalHandle::update(Space& home, bool share, LocalHandle& lh) {
2688
+ object(lh.object()->fwd(home,share));
2689
+ }
2690
+
2691
+
2692
+ /*
2693
+ * Choices
2694
+ *
2695
+ */
2696
+ forceinline
2697
+ Choice::Choice(const Brancher& b, const unsigned int a)
2698
+ : _id(b.id()), _alt(a) {}
2699
+
2700
+ forceinline unsigned int
2701
+ Choice::alternatives(void) const {
2702
+ return _alt;
2703
+ }
2704
+
2705
+ forceinline unsigned int
2706
+ Choice::id(void) const {
2707
+ return _id;
2708
+ }
2709
+
2710
+ forceinline
2711
+ Choice::~Choice(void) {}
2712
+
2713
+
2714
+
2715
+ /*
2716
+ * Advisor
2717
+ *
2718
+ */
2719
+ template<class A>
2720
+ forceinline
2721
+ Advisor::Advisor(Space&, Propagator& p, Council<A>& c) {
2722
+ // Store propagator and forwarding in prev()
2723
+ ActorLink::prev(&p);
2724
+ // Link to next advisor in next()
2725
+ ActorLink::next(c.advisors); c.advisors = static_cast<A*>(this);
2726
+ }
2727
+
2728
+ forceinline
2729
+ Advisor::Advisor(Space&, bool, Advisor&) {}
2730
+
2731
+ forceinline bool
2732
+ Advisor::disposed(void) const {
2733
+ return prev() == NULL;
2734
+ }
2735
+
2736
+ forceinline Advisor*
2737
+ Advisor::cast(ActorLink* al) {
2738
+ return static_cast<Advisor*>(al);
2739
+ }
2740
+
2741
+ forceinline const Advisor*
2742
+ Advisor::cast(const ActorLink* al) {
2743
+ return static_cast<const Advisor*>(al);
2744
+ }
2745
+
2746
+ forceinline Propagator&
2747
+ Advisor::propagator(void) const {
2748
+ assert(!disposed());
2749
+ return *Propagator::cast(ActorLink::prev());
2750
+ }
2751
+
2752
+ template<class A>
2753
+ forceinline void
2754
+ Advisor::dispose(Space&,Council<A>&) {
2755
+ assert(!disposed());
2756
+ ActorLink::prev(NULL);
2757
+ // Shorten chains of disposed advisors by one, if possible
2758
+ Advisor* n = Advisor::cast(next());
2759
+ if ((n != NULL) && n->disposed())
2760
+ next(n->next());
2761
+ }
2762
+
2763
+ template<class A>
2764
+ forceinline ExecStatus
2765
+ Space::ES_FIX_DISPOSE(Council<A>& c, A& a) {
2766
+ a.dispose(*this,c);
2767
+ return ES_FIX;
2768
+ }
2769
+
2770
+ template<class A>
2771
+ forceinline ExecStatus
2772
+ Space::ES_NOFIX_DISPOSE(Council<A>& c, A& a) {
2773
+ a.dispose(*this,c);
2774
+ return ES_NOFIX;
2775
+ }
2776
+
2777
+ template<class A>
2778
+ forceinline ExecStatus
2779
+ Space::ES_NOFIX_DISPOSE_FORCE(Council<A>& c, A& a) {
2780
+ a.dispose(*this,c);
2781
+ return ES_NOFIX_FORCE;
2782
+ }
2783
+
2784
+
2785
+
2786
+ /*
2787
+ * Advisor council
2788
+ *
2789
+ */
2790
+ template<class A>
2791
+ forceinline
2792
+ Council<A>::Council(void) {}
2793
+
2794
+ template<class A>
2795
+ forceinline
2796
+ Council<A>::Council(Space&)
2797
+ : advisors(NULL) {}
2798
+
2799
+ template<class A>
2800
+ forceinline bool
2801
+ Council<A>::empty(void) const {
2802
+ ActorLink* a = advisors;
2803
+ while ((a != NULL) && static_cast<A*>(a)->disposed())
2804
+ a = a->next();
2805
+ advisors = a;
2806
+ return a == NULL;
2807
+ }
2808
+
2809
+ template<class A>
2810
+ forceinline void
2811
+ Council<A>::update(Space& home, bool share, Council<A>& c) {
2812
+ // Skip all disposed advisors
2813
+ {
2814
+ ActorLink* a = c.advisors;
2815
+ while ((a != NULL) && static_cast<A*>(a)->disposed())
2816
+ a = a->next();
2817
+ c.advisors = a;
2818
+ }
2819
+ // Are there any advisors to be cloned?
2820
+ if (c.advisors != NULL) {
2821
+ // The propagator in from-space
2822
+ Propagator* p_f = &static_cast<A*>(c.advisors)->propagator();
2823
+ // The propagator in to-space
2824
+ Propagator* p_t = Propagator::cast(p_f->prev());
2825
+ // Advisors in from-space
2826
+ ActorLink** a_f = &c.advisors;
2827
+ // Advisors in to-space
2828
+ A* a_t = NULL;
2829
+ while (*a_f != NULL) {
2830
+ if (static_cast<A*>(*a_f)->disposed()) {
2831
+ *a_f = (*a_f)->next();
2832
+ } else {
2833
+ // Run specific copying part
2834
+ A* a = new (home) A(home,share,*static_cast<A*>(*a_f));
2835
+ // Set propagator pointer
2836
+ a->prev(p_t);
2837
+ // Set forwarding pointer
2838
+ (*a_f)->prev(a);
2839
+ // Link
2840
+ a->next(a_t);
2841
+ a_t = a;
2842
+ a_f = (*a_f)->next_ref();
2843
+ }
2844
+ }
2845
+ advisors = a_t;
2846
+ // Enter advisor link for reset
2847
+ assert(p_f->u.advisors == NULL);
2848
+ p_f->u.advisors = c.advisors;
2849
+ } else {
2850
+ advisors = NULL;
2851
+ }
2852
+ }
2853
+
2854
+ template<class A>
2855
+ forceinline void
2856
+ Council<A>::dispose(Space& home) {
2857
+ ActorLink* a = advisors;
2858
+ while (a != NULL) {
2859
+ if (!static_cast<A*>(a)->disposed())
2860
+ static_cast<A*>(a)->dispose(home,*this);
2861
+ a = a->next();
2862
+ }
2863
+ }
2864
+
2865
+
2866
+
2867
+ /*
2868
+ * Advisor iterator
2869
+ *
2870
+ */
2871
+ template<class A>
2872
+ forceinline
2873
+ Advisors<A>::Advisors(const Council<A>& c)
2874
+ : a(c.advisors) {
2875
+ while ((a != NULL) && static_cast<A*>(a)->disposed())
2876
+ a = a->next();
2877
+ }
2878
+
2879
+ template<class A>
2880
+ forceinline bool
2881
+ Advisors<A>::operator ()(void) const {
2882
+ return a != NULL;
2883
+ }
2884
+
2885
+ template<class A>
2886
+ forceinline void
2887
+ Advisors<A>::operator ++(void) {
2888
+ do {
2889
+ a = a->next();
2890
+ } while ((a != NULL) && static_cast<A*>(a)->disposed());
2891
+ }
2892
+
2893
+ template<class A>
2894
+ forceinline A&
2895
+ Advisors<A>::advisor(void) const {
2896
+ return *static_cast<A*>(a);
2897
+ }
2898
+
2899
+
2900
+
2901
+ /*
2902
+ * Space
2903
+ *
2904
+ */
2905
+ forceinline void
2906
+ Space::enqueue(Propagator* p) {
2907
+ ActorLink::cast(p)->unlink();
2908
+ ActorLink* c = &pc.p.queue[p->cost(*this,p->u.med).ac];
2909
+ c->tail(ActorLink::cast(p));
2910
+ if (c > pc.p.active)
2911
+ pc.p.active = c;
2912
+ }
2913
+
2914
+ forceinline void
2915
+ Space::fail(void) {
2916
+ /*
2917
+ * Now active points beyond the last queue. This is essential as
2918
+ * enqueuing a propagator in a failed space keeps the space
2919
+ * failed.
2920
+ */
2921
+ pc.p.active = &pc.p.queue[PropCost::AC_MAX+1]+1;
2922
+ }
2923
+ forceinline void
2924
+ Home::fail(void) {
2925
+ s.fail();
2926
+ }
2927
+
2928
+ forceinline bool
2929
+ Space::failed(void) const {
2930
+ return pc.p.active > &pc.p.queue[PropCost::AC_MAX+1];
2931
+ }
2932
+ forceinline bool
2933
+ Home::failed(void) const {
2934
+ return s.failed();
2935
+ }
2936
+
2937
+ forceinline bool
2938
+ Space::stable(void) const {
2939
+ return ((pc.p.active < &pc.p.queue[0]) ||
2940
+ (pc.p.active > &pc.p.queue[PropCost::AC_MAX+1]));
2941
+ }
2942
+
2943
+
2944
+
2945
+ /*
2946
+ * Variable implementation
2947
+ *
2948
+ */
2949
+ template<class VIC>
2950
+ forceinline ActorLink**
2951
+ VarImp<VIC>::actor(PropCond pc) {
2952
+ assert((pc >= 0) && (pc < pc_max+2));
2953
+ return (pc == 0) ? b.base : b.base+u.idx[pc-1];
2954
+ }
2955
+
2956
+ template<class VIC>
2957
+ forceinline ActorLink**
2958
+ VarImp<VIC>::actorNonZero(PropCond pc) {
2959
+ assert((pc > 0) && (pc < pc_max+2));
2960
+ return b.base+u.idx[pc-1];
2961
+ }
2962
+
2963
+ template<class VIC>
2964
+ forceinline unsigned int&
2965
+ VarImp<VIC>::idx(PropCond pc) {
2966
+ assert((pc > 0) && (pc < pc_max+2));
2967
+ return u.idx[pc-1];
2968
+ }
2969
+
2970
+ template<class VIC>
2971
+ forceinline unsigned int
2972
+ VarImp<VIC>::idx(PropCond pc) const {
2973
+ assert((pc > 0) && (pc < pc_max+2));
2974
+ return u.idx[pc-1];
2975
+ }
2976
+
2977
+ template<class VIC>
2978
+ forceinline
2979
+ VarImp<VIC>::VarImp(Space&) {
2980
+ b.base = NULL; entries = 0;
2981
+ for (PropCond pc=1; pc<pc_max+2; pc++)
2982
+ idx(pc) = 0;
2983
+ free_and_bits = 0;
2984
+ }
2985
+
2986
+ template<class VIC>
2987
+ forceinline
2988
+ VarImp<VIC>::VarImp(void) {
2989
+ b.base = NULL; entries = 0;
2990
+ for (PropCond pc=1; pc<pc_max+2; pc++)
2991
+ idx(pc) = 0;
2992
+ free_and_bits = 0;
2993
+ }
2994
+
2995
+ template<class VIC>
2996
+ forceinline unsigned int
2997
+ VarImp<VIC>::degree(void) const {
2998
+ assert(!copied());
2999
+ return entries;
3000
+ }
3001
+
3002
+ template<class VIC>
3003
+ forceinline double
3004
+ VarImp<VIC>::afc(void) const {
3005
+ if (degree() == 0)
3006
+ return 0.0;
3007
+ double d = degree();
3008
+ // Count the afc of each propagator
3009
+ {
3010
+ ActorLink** a = const_cast<VarImp<VIC>*>(this)->actor(0);
3011
+ ActorLink** e = const_cast<VarImp<VIC>*>(this)->actorNonZero(pc_max+1);
3012
+ while (a < e) {
3013
+ d += Propagator::cast(*a)->afc(); a++;
3014
+ }
3015
+ }
3016
+ // Count the afc of each advisor's propagator
3017
+ {
3018
+ ActorLink** a = const_cast<VarImp<VIC>*>(this)->actorNonZero(pc_max+1);
3019
+ ActorLink** e = const_cast<VarImp<VIC>*>(this)->b.base+entries;
3020
+ while (a < e) {
3021
+ d += Advisor::cast(*a)->propagator().afc(); a++;
3022
+ }
3023
+ }
3024
+ return d;
3025
+ }
3026
+
3027
+ template<class VIC>
3028
+ forceinline ModEvent
3029
+ VarImp<VIC>::modevent(const Delta& d) {
3030
+ return d.me;
3031
+ }
3032
+
3033
+ template<class VIC>
3034
+ forceinline unsigned int
3035
+ VarImp<VIC>::bits(void) const {
3036
+ return free_and_bits;
3037
+ }
3038
+
3039
+ template<class VIC>
3040
+ forceinline unsigned int&
3041
+ VarImp<VIC>::bits(void) {
3042
+ return free_and_bits;
3043
+ }
3044
+
3045
+ #ifdef GECODE_HAS_VAR_DISPOSE
3046
+ template<class VIC>
3047
+ forceinline VarImp<VIC>*
3048
+ VarImp<VIC>::vars_d(Space& home) {
3049
+ return static_cast<VarImp<VIC>*>(home.vars_d<VIC>());
3050
+ }
3051
+
3052
+ template<class VIC>
3053
+ forceinline void
3054
+ VarImp<VIC>::vars_d(Space& home, VarImp<VIC>* x) {
3055
+ home.vars_d<VIC>(x);
3056
+ }
3057
+ #endif
3058
+
3059
+ template<class VIC>
3060
+ forceinline bool
3061
+ VarImp<VIC>::copied(void) const {
3062
+ return Support::marked(b.fwd);
3063
+ }
3064
+
3065
+ template<class VIC>
3066
+ forceinline VarImp<VIC>*
3067
+ VarImp<VIC>::forward(void) const {
3068
+ assert(copied());
3069
+ return static_cast<VarImp<VIC>*>(Support::unmark(b.fwd));
3070
+ }
3071
+
3072
+ template<class VIC>
3073
+ forceinline VarImp<VIC>*
3074
+ VarImp<VIC>::next(void) const {
3075
+ assert(copied());
3076
+ return u.next;
3077
+ }
3078
+
3079
+ template<class VIC>
3080
+ forceinline
3081
+ VarImp<VIC>::VarImp(Space& home, bool, VarImp<VIC>& x) {
3082
+ VarImpBase** reg;
3083
+ free_and_bits = x.free_and_bits & ((1 << free_bits) - 1);
3084
+ if (x.b.base == NULL) {
3085
+ // Variable implementation needs no index structure
3086
+ reg = &home.pc.c.vars_noidx;
3087
+ assert(x.degree() == 0);
3088
+ } else {
3089
+ reg = &home.pc.c.vars_u[idx_c];
3090
+ }
3091
+ // Save subscriptions in copy
3092
+ b.base = x.b.base;
3093
+ entries = x.entries;
3094
+ for (PropCond pc=1; pc<pc_max+2; pc++)
3095
+ idx(pc) = x.idx(pc);
3096
+
3097
+ // Set forwarding pointer
3098
+ x.b.fwd = static_cast<VarImp<VIC>*>(Support::mark(this));
3099
+ // Register original
3100
+ x.u.next = static_cast<VarImp<VIC>*>(*reg); *reg = &x;
3101
+ }
3102
+
3103
+ template<class VIC>
3104
+ forceinline ModEvent
3105
+ VarImp<VIC>::me(const ModEventDelta& med) {
3106
+ return static_cast<ModEvent>((med & VIC::med_mask) >> VIC::med_fst);
3107
+ }
3108
+
3109
+ template<class VIC>
3110
+ forceinline ModEventDelta
3111
+ VarImp<VIC>::med(ModEvent me) {
3112
+ return static_cast<ModEventDelta>(me << VIC::med_fst);
3113
+ }
3114
+
3115
+ template<class VIC>
3116
+ forceinline ModEvent
3117
+ VarImp<VIC>::me_combine(ModEvent me1, ModEvent me2) {
3118
+ return VIC::me_combine(me1,me2);
3119
+ }
3120
+
3121
+ template<class VIC>
3122
+ forceinline void
3123
+ VarImp<VIC>::schedule(Space& home, Propagator& p, ModEvent me,
3124
+ bool force) {
3125
+ if (VIC::med_update(p.u.med,me) || force)
3126
+ home.enqueue(&p);
3127
+ }
3128
+
3129
+ template<class VIC>
3130
+ forceinline void
3131
+ VarImp<VIC>::schedule(Space& home, PropCond pc1, PropCond pc2, ModEvent me) {
3132
+ ActorLink** b = actor(pc1);
3133
+ ActorLink** p = actorNonZero(pc2+1);
3134
+ while (p-- > b)
3135
+ schedule(home,*Propagator::cast(*p),me);
3136
+ }
3137
+
3138
+ template<class VIC>
3139
+ forceinline void
3140
+ VarImp<VIC>::enter(Space& home, Propagator* p, PropCond pc) {
3141
+ assert(pc <= pc_max);
3142
+ // Count one new subscription
3143
+ home.pc.p.n_sub += 1;
3144
+ if ((free_and_bits >> free_bits) == 0)
3145
+ resize(home);
3146
+ free_and_bits -= 1 << free_bits;
3147
+
3148
+ // Enter subscription
3149
+ b.base[entries] = *actorNonZero(pc_max+1);
3150
+ entries++;
3151
+ for (PropCond j = pc_max; j > pc; j--) {
3152
+ *actorNonZero(j+1) = *actorNonZero(j);
3153
+ idx(j+1)++;
3154
+ }
3155
+ *actorNonZero(pc+1) = *actor(pc);
3156
+ idx(pc+1)++;
3157
+ *actor(pc) = ActorLink::cast(p);
3158
+
3159
+ #ifdef GECODE_AUDIT
3160
+ ActorLink** f = actor(pc);
3161
+ while (f < (pc == pc_max+1 ? b.base+entries : actorNonZero(pc+1)))
3162
+ if (*f == p)
3163
+ goto found;
3164
+ else
3165
+ f++;
3166
+ GECODE_NEVER;
3167
+ found: ;
3168
+ #endif
3169
+ }
3170
+
3171
+ template<class VIC>
3172
+ forceinline void
3173
+ VarImp<VIC>::enter(Space& home, Advisor* a) {
3174
+ // Count one new subscription
3175
+ home.pc.p.n_sub += 1;
3176
+ if ((free_and_bits >> free_bits) == 0)
3177
+ resize(home);
3178
+ free_and_bits -= 1 << free_bits;
3179
+
3180
+ // Enter subscription
3181
+ b.base[entries++] = *actorNonZero(pc_max+1);
3182
+ *actorNonZero(pc_max+1) = a;
3183
+ }
3184
+
3185
+ template<class VIC>
3186
+ void
3187
+ VarImp<VIC>::resize(Space& home) {
3188
+ if (b.base == NULL) {
3189
+ assert((free_and_bits >> free_bits) == 0);
3190
+ // Create fresh dependency array with four entries
3191
+ free_and_bits += 4 << free_bits;
3192
+ b.base = home.alloc<ActorLink*>(4);
3193
+ for (int i=0; i<pc_max+1; i++)
3194
+ u.idx[i] = 0;
3195
+ } else {
3196
+ // Resize dependency array
3197
+ unsigned int n = degree();
3198
+ // Find out whether the area is most likely in the special area
3199
+ // reserved for subscriptions. If yes, just resize mildly otherwise
3200
+ // more agressively
3201
+ ActorLink** s = static_cast<ActorLink**>(home.mm.subscriptions());
3202
+ unsigned int m =
3203
+ ((s <= b.base) && (b.base < s+home.pc.p.n_sub)) ?
3204
+ (n+4) : ((n+1)*3>>1);
3205
+ ActorLink** prop = home.alloc<ActorLink*>(m);
3206
+ free_and_bits += (m-n) << free_bits;
3207
+ // Copy entries
3208
+ Heap::copy<ActorLink*>(prop, b.base, n);
3209
+ home.free<ActorLink*>(b.base,n);
3210
+ b.base = prop;
3211
+ }
3212
+ }
3213
+
3214
+ template<class VIC>
3215
+ void
3216
+ VarImp<VIC>::subscribe(Space& home, Propagator& p, PropCond pc,
3217
+ bool assigned, ModEvent me, bool schedule) {
3218
+ if (assigned) {
3219
+ // Do not subscribe, just schedule the propagator
3220
+ if (schedule)
3221
+ VarImp<VIC>::schedule(home,p,ME_GEN_ASSIGNED);
3222
+ } else {
3223
+ enter(home,&p,pc);
3224
+ // Schedule propagator
3225
+ if (schedule && (pc != PC_GEN_ASSIGNED))
3226
+ VarImp<VIC>::schedule(home,p,me);
3227
+ }
3228
+ }
3229
+
3230
+ template<class VIC>
3231
+ forceinline void
3232
+ VarImp<VIC>::subscribe(Space& home, Advisor& a, bool assigned) {
3233
+ if (!assigned)
3234
+ enter(home,&a);
3235
+ }
3236
+
3237
+ template<class VIC>
3238
+ forceinline void
3239
+ VarImp<VIC>::remove(Space& home, Propagator* p, PropCond pc) {
3240
+ assert(pc <= pc_max);
3241
+ ActorLink* a = ActorLink::cast(p);
3242
+ // Find actor in dependency array
3243
+ ActorLink** f = actor(pc);
3244
+ #ifdef GECODE_AUDIT
3245
+ while (f < actorNonZero(pc+1))
3246
+ if (*f == a)
3247
+ goto found;
3248
+ else
3249
+ f++;
3250
+ GECODE_NEVER;
3251
+ found: ;
3252
+ #else
3253
+ while (*f != a) f++;
3254
+ #endif
3255
+ // Remove actor
3256
+ *f = *(actorNonZero(pc+1)-1);
3257
+ for (PropCond j = pc+1; j< pc_max+1; j++) {
3258
+ *(actorNonZero(j)-1) = *(actorNonZero(j+1)-1);
3259
+ idx(j)--;
3260
+ }
3261
+ *(actorNonZero(pc_max+1)-1) = b.base[entries-1];
3262
+ idx(pc_max+1)--;
3263
+ entries--;
3264
+ free_and_bits += 1 << free_bits;
3265
+ home.pc.p.n_sub -= 1;
3266
+ }
3267
+
3268
+ template<class VIC>
3269
+ forceinline void
3270
+ VarImp<VIC>::remove(Space& home, Advisor* a) {
3271
+ // Find actor in dependency array
3272
+ ActorLink** f = actorNonZero(pc_max+1);
3273
+ #ifdef GECODE_AUDIT
3274
+ while (f < b.base+entries)
3275
+ if (*f == a)
3276
+ goto found;
3277
+ else
3278
+ f++;
3279
+ GECODE_NEVER;
3280
+ found: ;
3281
+ #else
3282
+ while (*f != a) f++;
3283
+ #endif
3284
+ // Remove actor
3285
+ *f = b.base[--entries];
3286
+ free_and_bits += 1 << free_bits;
3287
+ home.pc.p.n_sub -= 1;
3288
+ }
3289
+
3290
+ template<class VIC>
3291
+ forceinline void
3292
+ VarImp<VIC>::cancel(Space& home, Propagator& p, PropCond pc, bool assigned) {
3293
+ if (!assigned)
3294
+ remove(home,&p,pc);
3295
+ }
3296
+
3297
+ template<class VIC>
3298
+ forceinline void
3299
+ VarImp<VIC>::cancel(Space& home, Advisor& a, bool assigned) {
3300
+ if (!assigned)
3301
+ remove(home,&a);
3302
+ }
3303
+
3304
+ template<class VIC>
3305
+ forceinline void
3306
+ VarImp<VIC>::cancel(Space& home) {
3307
+ unsigned int n_sub = degree();
3308
+ home.pc.p.n_sub -= n_sub;
3309
+ unsigned int n = (free_and_bits >> VIC::free_bits) + n_sub;
3310
+ home.free<ActorLink*>(b.base,n);
3311
+ // Must be NULL such that cloning works
3312
+ b.base = NULL;
3313
+ // Must be 0 such that degree works
3314
+ entries = 0;
3315
+ }
3316
+
3317
+ template<class VIC>
3318
+ forceinline bool
3319
+ VarImp<VIC>::advise(Space& home, ModEvent me, Delta& d) {
3320
+ /*
3321
+ * An advisor that is executed might remove itself due to subsumption.
3322
+ * As entries are removed from front to back, the advisors must
3323
+ * be iterated in forward direction.
3324
+ */
3325
+ ActorLink** la = actorNonZero(pc_max+1);
3326
+ ActorLink** le = b.base+entries;
3327
+ if (la == le)
3328
+ return true;
3329
+ d.me = me;
3330
+ // An advisor that is run, might be removed during execution.
3331
+ // As removal is done from the back the advisors have to be executed
3332
+ // in inverse order.
3333
+ do {
3334
+ Advisor* a = Advisor::cast(*la);
3335
+ assert(!a->disposed());
3336
+ Propagator& p = a->propagator();
3337
+ switch (p.advise(home,*a,d)) {
3338
+ case ES_FIX:
3339
+ break;
3340
+ case ES_FAILED:
3341
+ p.pi.fail(home.gpi);
3342
+ return false;
3343
+ case ES_NOFIX:
3344
+ schedule(home,p,me);
3345
+ break;
3346
+ case ES_NOFIX_FORCE:
3347
+ schedule(home,p,me,true);
3348
+ break;
3349
+ default:
3350
+ GECODE_NEVER;
3351
+ }
3352
+ } while (++la < le);
3353
+ return true;
3354
+ }
3355
+
3356
+ template<class VIC>
3357
+ forceinline void
3358
+ VarImp<VIC>::update(VarImp<VIC>* x, ActorLink**& sub) {
3359
+ // this refers to the variable to be updated (clone)
3360
+ // x refers to the original
3361
+ // Recover from copy
3362
+ x->b.base = b.base;
3363
+ x->u.idx[0] = u.idx[0];
3364
+ if (pc_max > 0 && sizeof(ActorLink**) > sizeof(unsigned int))
3365
+ x->u.idx[1] = u.idx[1];
3366
+
3367
+ ActorLink** f = x->b.base;
3368
+ unsigned int n = x->degree();
3369
+ ActorLink** t = sub;
3370
+ sub += n;
3371
+ b.base = t;
3372
+ // Set subscriptions using actor forwarding pointers
3373
+ while (n >= 4) {
3374
+ n -= 4;
3375
+ t[0]=f[0]->prev(); t[1]=f[1]->prev();
3376
+ t[2]=f[2]->prev(); t[3]=f[3]->prev();
3377
+ t += 4; f += 4;
3378
+ }
3379
+ if (n >= 2) {
3380
+ n -= 2;
3381
+ t[0]=f[0]->prev(); t[1]=f[1]->prev();
3382
+ t += 2; f += 2;
3383
+ }
3384
+ if (n > 0) {
3385
+ t[0]=f[0]->prev();
3386
+ }
3387
+ }
3388
+
3389
+ template<class VIC>
3390
+ forceinline void
3391
+ VarImp<VIC>::update(Space& home, ActorLink**& sub) {
3392
+ VarImp<VIC>* x = static_cast<VarImp<VIC>*>(home.pc.c.vars_u[idx_c]);
3393
+ while (x != NULL) {
3394
+ VarImp<VIC>* n = x->next(); x->forward()->update(x,sub); x = n;
3395
+ }
3396
+ }
3397
+
3398
+
3399
+
3400
+ /*
3401
+ * Variable disposer
3402
+ *
3403
+ */
3404
+ template<class VarImp>
3405
+ VarImpDisposer<VarImp>::VarImpDisposer(void) {
3406
+ #ifdef GECODE_HAS_VAR_DISPOSE
3407
+ Space::vd[VarImp::idx_d] = this;
3408
+ #endif
3409
+ }
3410
+
3411
+ template<class VarImp>
3412
+ void
3413
+ VarImpDisposer<VarImp>::dispose(Space& home, VarImpBase* _x) {
3414
+ VarImp* x = static_cast<VarImp*>(_x);
3415
+ do {
3416
+ x->dispose(home); x = static_cast<VarImp*>(x->next_d());
3417
+ } while (x != NULL);
3418
+ }
3419
+
3420
+ /*
3421
+ * Statistics
3422
+ */
3423
+
3424
+ forceinline void
3425
+ StatusStatistics::reset(void) {
3426
+ propagate = 0;
3427
+ wmp = false;
3428
+ }
3429
+ forceinline
3430
+ StatusStatistics::StatusStatistics(void) {
3431
+ reset();
3432
+ }
3433
+ forceinline StatusStatistics&
3434
+ StatusStatistics::operator +=(const StatusStatistics& s) {
3435
+ propagate += s.propagate;
3436
+ wmp |= s.wmp;
3437
+ return *this;
3438
+ }
3439
+ forceinline StatusStatistics
3440
+ StatusStatistics::operator +(const StatusStatistics& s) {
3441
+ StatusStatistics t(s);
3442
+ return t += *this;
3443
+ }
3444
+
3445
+ forceinline void
3446
+ CloneStatistics::reset(void) {}
3447
+
3448
+ forceinline
3449
+ CloneStatistics::CloneStatistics(void) {
3450
+ reset();
3451
+ }
3452
+ forceinline CloneStatistics
3453
+ CloneStatistics::operator +(const CloneStatistics&) {
3454
+ CloneStatistics s;
3455
+ return s;
3456
+ }
3457
+ forceinline CloneStatistics&
3458
+ CloneStatistics::operator +=(const CloneStatistics&) {
3459
+ return *this;
3460
+ }
3461
+
3462
+ forceinline void
3463
+ CommitStatistics::reset(void) {}
3464
+
3465
+ forceinline
3466
+ CommitStatistics::CommitStatistics(void) {
3467
+ reset();
3468
+ }
3469
+ forceinline CommitStatistics
3470
+ CommitStatistics::operator +(const CommitStatistics&) {
3471
+ CommitStatistics s;
3472
+ return s;
3473
+ }
3474
+ forceinline CommitStatistics&
3475
+ CommitStatistics::operator +=(const CommitStatistics&) {
3476
+ return *this;
3477
+ }
3478
+
3479
+ /*
3480
+ * Cost computation
3481
+ *
3482
+ */
3483
+
3484
+ forceinline
3485
+ PropCost::PropCost(PropCost::ActualCost ac0) : ac(ac0) {}
3486
+
3487
+ forceinline PropCost
3488
+ PropCost::cost(PropCost::Mod m,
3489
+ PropCost::ActualCost lo, PropCost::ActualCost hi,
3490
+ unsigned int n) {
3491
+ if (n < 2)
3492
+ return (m == LO) ? AC_UNARY_LO : AC_UNARY_HI;
3493
+ else if (n == 2)
3494
+ return (m == LO) ? AC_BINARY_LO : AC_BINARY_HI;
3495
+ else if (n == 3)
3496
+ return (m == LO) ? AC_TERNARY_LO : AC_TERNARY_HI;
3497
+ else
3498
+ return (m == LO) ? lo : hi;
3499
+ }
3500
+
3501
+ forceinline PropCost
3502
+ PropCost::crazy(PropCost::Mod m, unsigned int n) {
3503
+ return cost(m,AC_CRAZY_LO,AC_CRAZY_HI,n);
3504
+ }
3505
+ forceinline PropCost
3506
+ PropCost::crazy(PropCost::Mod m, int n) {
3507
+ assert(n >= 0);
3508
+ return crazy(m,static_cast<unsigned int>(n));
3509
+ }
3510
+ forceinline PropCost
3511
+ PropCost::cubic(PropCost::Mod m, unsigned int n) {
3512
+ return cost(m,AC_CUBIC_LO,AC_CUBIC_HI,n);
3513
+ }
3514
+ forceinline PropCost
3515
+ PropCost::cubic(PropCost::Mod m, int n) {
3516
+ assert(n >= 0);
3517
+ return cubic(m,static_cast<unsigned int>(n));
3518
+ }
3519
+ forceinline PropCost
3520
+ PropCost::quadratic(PropCost::Mod m, unsigned int n) {
3521
+ return cost(m,AC_QUADRATIC_LO,AC_QUADRATIC_HI,n);
3522
+ }
3523
+ forceinline PropCost
3524
+ PropCost::quadratic(PropCost::Mod m, int n) {
3525
+ assert(n >= 0);
3526
+ return quadratic(m,static_cast<unsigned int>(n));
3527
+ }
3528
+ forceinline PropCost
3529
+ PropCost::linear(PropCost::Mod m, unsigned int n) {
3530
+ return cost(m,AC_LINEAR_LO,AC_LINEAR_HI,n);
3531
+ }
3532
+ forceinline PropCost
3533
+ PropCost::linear(PropCost::Mod m, int n) {
3534
+ assert(n >= 0);
3535
+ return linear(m,static_cast<unsigned int>(n));
3536
+ }
3537
+ forceinline PropCost
3538
+ PropCost::ternary(PropCost::Mod m) {
3539
+ return (m == LO) ? AC_TERNARY_LO : AC_TERNARY_HI;
3540
+ }
3541
+ forceinline PropCost
3542
+ PropCost::binary(PropCost::Mod m) {
3543
+ return (m == LO) ? AC_BINARY_LO : AC_BINARY_HI;
3544
+ }
3545
+ forceinline PropCost
3546
+ PropCost::unary(PropCost::Mod m) {
3547
+ return (m == LO) ? AC_UNARY_LO : AC_UNARY_HI;
3548
+ }
3549
+
3550
+ /*
3551
+ * Iterators for propagators and branchers of a space
3552
+ *
3553
+ */
3554
+ forceinline
3555
+ Space::Propagators::Propagators(const Space& home0)
3556
+ : home(home0), q(home.pc.p.active) {
3557
+ while (q >= &home.pc.p.queue[0]) {
3558
+ if (q->next() != q) {
3559
+ c = q->next(); e = q; q--;
3560
+ return;
3561
+ }
3562
+ q--;
3563
+ }
3564
+ q = NULL;
3565
+ if (!home.pl.empty()) {
3566
+ c = Propagator::cast(home.pl.next());
3567
+ e = Propagator::cast(&home.pl);
3568
+ } else {
3569
+ c = e = NULL;
3570
+ }
3571
+ }
3572
+ forceinline bool
3573
+ Space::Propagators::operator ()(void) const {
3574
+ return c != NULL;
3575
+ }
3576
+ forceinline void
3577
+ Space::Propagators::operator ++(void) {
3578
+ c = c->next();
3579
+ if (c == e) {
3580
+ if (q == NULL) {
3581
+ c = NULL;
3582
+ } else {
3583
+ while (q >= &home.pc.p.queue[0]) {
3584
+ if (q->next() != q) {
3585
+ c = q->next(); e = q; q--;
3586
+ return;
3587
+ }
3588
+ q--;
3589
+ }
3590
+ q = NULL;
3591
+ if (!home.pl.empty()) {
3592
+ c = Propagator::cast(home.pl.next());
3593
+ e = Propagator::cast(&home.pl);
3594
+ } else {
3595
+ c = NULL;
3596
+ }
3597
+ }
3598
+ }
3599
+ }
3600
+ forceinline const Propagator&
3601
+ Space::Propagators::propagator(void) const {
3602
+ return *Propagator::cast(c);
3603
+ }
3604
+
3605
+ forceinline
3606
+ Space::Branchers::Branchers(const Space& home)
3607
+ : c(Brancher::cast(home.bl.next())), e(&home.bl) {}
3608
+ forceinline bool
3609
+ Space::Branchers::operator ()(void) const {
3610
+ return c != e;
3611
+ }
3612
+ forceinline void
3613
+ Space::Branchers::operator ++(void) {
3614
+ c = c->next();
3615
+ }
3616
+ forceinline const Brancher&
3617
+ Space::Branchers::brancher(void) const {
3618
+ return *Brancher::cast(c);
3619
+ }
3620
+
3621
+ /*
3622
+ * Space construction support
3623
+ *
3624
+ */
3625
+ template<class T>
3626
+ forceinline T&
3627
+ Space::construct(void) {
3628
+ return alloc<T>(1);
3629
+ }
3630
+ template<class T, typename A1>
3631
+ forceinline T&
3632
+ Space::construct(A1 const& a1) {
3633
+ T& t = *static_cast<T*>(ralloc(sizeof(T)));
3634
+ new (&t) T(a1);
3635
+ return t;
3636
+ }
3637
+ template<class T, typename A1, typename A2>
3638
+ forceinline T&
3639
+ Space::construct(A1 const& a1, A2 const& a2) {
3640
+ T& t = *static_cast<T*>(ralloc(sizeof(T)));
3641
+ new (&t) T(a1,a2);
3642
+ return t;
3643
+ }
3644
+ template<class T, typename A1, typename A2, typename A3>
3645
+ forceinline T&
3646
+ Space::construct(A1 const& a1, A2 const& a2, A3 const& a3) {
3647
+ T& t = *static_cast<T*>(ralloc(sizeof(T)));
3648
+ new (&t) T(a1,a2,a3);
3649
+ return t;
3650
+ }
3651
+ template<class T, typename A1, typename A2, typename A3, typename A4>
3652
+ forceinline T&
3653
+ Space::construct(A1 const& a1, A2 const& a2, A3 const& a3, A4 const& a4) {
3654
+ T& t = *static_cast<T*>(ralloc(sizeof(T)));
3655
+ new (&t) T(a1,a2,a3,a4);
3656
+ return t;
3657
+ }
3658
+ template<class T, typename A1, typename A2, typename A3, typename A4, typename A5>
3659
+ forceinline T&
3660
+ Space::construct(A1 const& a1, A2 const& a2, A3 const& a3, A4 const& a4, A5 const& a5) {
3661
+ T& t = *static_cast<T*>(ralloc(sizeof(T)));
3662
+ new (&t) T(a1,a2,a3,a4,a5);
3663
+ return t;
3664
+ }
3665
+
3666
+ }
3667
+
3668
+ // STATISTICS: kernel-core