gecoder-with-gecode 0.7.1 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (1063) hide show
  1. data/CHANGES +7 -0
  2. data/README +10 -1
  3. data/ext/extconf.rb +24 -7
  4. data/ext/gecode-2.1.1/LICENSE +25 -0
  5. data/ext/gecode-2.1.1/Makefile.contribs +86 -0
  6. data/ext/gecode-2.1.1/Makefile.dep +7622 -0
  7. data/ext/gecode-2.1.1/Makefile.in +1568 -0
  8. data/ext/gecode-2.1.1/changelog.in +2459 -0
  9. data/ext/gecode-2.1.1/configure +11631 -0
  10. data/ext/gecode-2.1.1/configure.ac +249 -0
  11. data/ext/gecode-2.1.1/configure.ac.in +245 -0
  12. data/ext/{gecode-1.3.1 → gecode-2.1.1}/contribs/README +0 -0
  13. data/ext/gecode-2.1.1/contribs/qecode/Doxyfile +263 -0
  14. data/ext/gecode-2.1.1/contribs/qecode/FirstFailValueHeuristic.cc +82 -0
  15. data/ext/gecode-2.1.1/contribs/qecode/FirstFailValueHeuristic.hh +37 -0
  16. data/ext/gecode-2.1.1/contribs/qecode/Makefile.in.in +162 -0
  17. data/ext/gecode-2.1.1/contribs/qecode/NaiveValueHeuristics.cc +172 -0
  18. data/ext/gecode-2.1.1/contribs/qecode/NaiveValueHeuristics.hh +63 -0
  19. data/ext/gecode-2.1.1/contribs/qecode/SDFVariableHeuristic.cc +37 -0
  20. data/ext/gecode-2.1.1/contribs/qecode/SDFVariableHeuristic.hh +35 -0
  21. data/ext/gecode-2.1.1/contribs/qecode/configure +2264 -0
  22. data/ext/gecode-2.1.1/contribs/qecode/configure.ac +23 -0
  23. data/ext/gecode-2.1.1/contribs/qecode/examples/COMPILING +13 -0
  24. data/ext/gecode-2.1.1/contribs/qecode/examples/MatrixGame.cpp +144 -0
  25. data/ext/gecode-2.1.1/contribs/qecode/examples/NimFibo.cpp +73 -0
  26. data/ext/gecode-2.1.1/contribs/qecode/examples/stress_test.cpp +179 -0
  27. data/ext/gecode-2.1.1/contribs/qecode/extensivecomparator.cc +34 -0
  28. data/ext/gecode-2.1.1/contribs/qecode/extensivecomparator.hh +46 -0
  29. data/ext/gecode-2.1.1/contribs/qecode/heap.cc +151 -0
  30. data/ext/gecode-2.1.1/contribs/qecode/implicative.cc +595 -0
  31. data/ext/gecode-2.1.1/contribs/qecode/implicative.hh +184 -0
  32. data/ext/gecode-2.1.1/contribs/qecode/myDom.cc +39 -0
  33. data/ext/gecode-2.1.1/contribs/qecode/myspace.cc +69 -0
  34. data/ext/gecode-2.1.1/contribs/qecode/myspace.hh +69 -0
  35. data/ext/gecode-2.1.1/contribs/qecode/qecode.hh +56 -0
  36. data/ext/gecode-2.1.1/contribs/qecode/qecore.cc +145 -0
  37. data/ext/gecode-2.1.1/contribs/qecode/qecore.hh +247 -0
  38. data/ext/gecode-2.1.1/contribs/qecode/qsolver.cc +168 -0
  39. data/ext/gecode-2.1.1/contribs/qecode/qsolver.hh +73 -0
  40. data/ext/gecode-2.1.1/contribs/qecode/shortdesc.ac +1 -0
  41. data/ext/gecode-2.1.1/contribs/qecode/valueHeuristic.hh +91 -0
  42. data/ext/gecode-2.1.1/contribs/qecode/vartype.hh +31 -0
  43. data/ext/gecode-2.1.1/contribs/qecode/warner.cc +101 -0
  44. data/ext/gecode-2.1.1/contribs/qecode/warner.hh +83 -0
  45. data/ext/gecode-2.1.1/doxygen/doxygen.conf.in +1270 -0
  46. data/ext/gecode-2.1.1/doxygen/doxygen.hh.in +1111 -0
  47. data/ext/gecode-2.1.1/doxygen/reflection.hh +417 -0
  48. data/ext/gecode-2.1.1/gecode.m4 +956 -0
  49. data/ext/gecode-2.1.1/gecode/cpltset.hh +797 -0
  50. data/ext/gecode-2.1.1/gecode/cpltset/array.cc +121 -0
  51. data/ext/gecode-2.1.1/gecode/cpltset/array.icc +81 -0
  52. data/ext/gecode-2.1.1/gecode/cpltset/bddmanager.cc +59 -0
  53. data/ext/gecode-2.1.1/gecode/cpltset/bddmanager.icc +448 -0
  54. data/ext/gecode-2.1.1/gecode/cpltset/branch.cc +68 -0
  55. data/ext/gecode-2.1.1/gecode/cpltset/branch.hh +208 -0
  56. data/ext/gecode-2.1.1/gecode/cpltset/branch/select-val.icc +167 -0
  57. data/ext/gecode-2.1.1/gecode/cpltset/branch/select-view.icc +143 -0
  58. data/ext/gecode-2.1.1/gecode/cpltset/constraints/atmost.cc +472 -0
  59. data/ext/gecode-2.1.1/gecode/cpltset/constraints/cardinality.cc +69 -0
  60. data/ext/gecode-2.1.1/gecode/cpltset/constraints/distinct.cc +83 -0
  61. data/ext/gecode-2.1.1/gecode/cpltset/constraints/dom.cc +147 -0
  62. data/ext/gecode-2.1.1/gecode/cpltset/constraints/partition.cc +383 -0
  63. data/ext/gecode-2.1.1/gecode/cpltset/constraints/rangeroots.cc +466 -0
  64. data/ext/gecode-2.1.1/gecode/cpltset/constraints/rel.cc +530 -0
  65. data/ext/gecode-2.1.1/gecode/cpltset/constraints/select.cc +126 -0
  66. data/ext/gecode-2.1.1/gecode/cpltset/constraints/singleton.cc +55 -0
  67. data/ext/gecode-2.1.1/gecode/cpltset/exception.icc +172 -0
  68. data/ext/gecode-2.1.1/gecode/cpltset/propagators.hh +335 -0
  69. data/ext/gecode-2.1.1/gecode/cpltset/propagators/binary.icc +260 -0
  70. data/ext/gecode-2.1.1/gecode/cpltset/propagators/nary.icc +210 -0
  71. data/ext/gecode-2.1.1/gecode/cpltset/propagators/naryone.icc +165 -0
  72. data/ext/gecode-2.1.1/gecode/cpltset/propagators/narytwo.icc +191 -0
  73. data/ext/gecode-2.1.1/gecode/cpltset/propagators/singleton.icc +130 -0
  74. data/ext/gecode-2.1.1/gecode/cpltset/propagators/unary.icc +132 -0
  75. data/ext/gecode-2.1.1/gecode/cpltset/support.cc +673 -0
  76. data/ext/gecode-2.1.1/gecode/cpltset/support.icc +696 -0
  77. data/ext/gecode-2.1.1/gecode/cpltset/var-imp.icc +487 -0
  78. data/ext/gecode-2.1.1/gecode/cpltset/var-imp/cpltset.cc +926 -0
  79. data/ext/gecode-2.1.1/gecode/cpltset/var-imp/cpltset.icc +687 -0
  80. data/ext/gecode-2.1.1/gecode/cpltset/var-imp/cpltset.vis +86 -0
  81. data/ext/gecode-2.1.1/gecode/cpltset/var/cpltset.cc +101 -0
  82. data/ext/gecode-2.1.1/gecode/cpltset/var/cpltset.icc +219 -0
  83. data/ext/gecode-2.1.1/gecode/cpltset/view.icc +231 -0
  84. data/ext/gecode-2.1.1/gecode/cpltset/view/cpltset.icc +420 -0
  85. data/ext/gecode-2.1.1/gecode/cpltset/view/print.cc +166 -0
  86. data/ext/gecode-2.1.1/gecode/gist.hh +162 -0
  87. data/ext/gecode-2.1.1/gecode/gist/addchild.cc +191 -0
  88. data/ext/gecode-2.1.1/gecode/gist/addchild.hh +76 -0
  89. data/ext/gecode-2.1.1/gecode/gist/addvisualisationdialog.cc +139 -0
  90. data/ext/gecode-2.1.1/gecode/gist/addvisualisationdialog.hh +78 -0
  91. data/ext/gecode-2.1.1/gecode/gist/analysiscursor.cc +115 -0
  92. data/ext/gecode-2.1.1/gecode/gist/analysiscursor.hh +77 -0
  93. data/ext/gecode-2.1.1/gecode/gist/better.hh +59 -0
  94. data/ext/gecode-2.1.1/gecode/gist/config.cc +61 -0
  95. data/ext/gecode-2.1.1/gecode/gist/config.hh +62 -0
  96. data/ext/gecode-2.1.1/gecode/gist/drawingcursor.cc +245 -0
  97. data/ext/gecode-2.1.1/gecode/gist/drawingcursor.hh +101 -0
  98. data/ext/gecode-2.1.1/gecode/gist/gecodelogo.icc +522 -0
  99. data/ext/gecode-2.1.1/gecode/gist/gist.cc +129 -0
  100. data/ext/gecode-2.1.1/gecode/gist/gist.icc +76 -0
  101. data/ext/gecode-2.1.1/gecode/gist/mainwindow.cc +254 -0
  102. data/ext/gecode-2.1.1/gecode/gist/mainwindow.hh +86 -0
  103. data/ext/gecode-2.1.1/gecode/gist/node.cc +100 -0
  104. data/ext/gecode-2.1.1/gecode/gist/node.hh +89 -0
  105. data/ext/gecode-2.1.1/gecode/gist/nodecursor.cc +124 -0
  106. data/ext/gecode-2.1.1/gecode/gist/nodecursor.hh +122 -0
  107. data/ext/gecode-2.1.1/gecode/gist/nodecursor.icc +79 -0
  108. data/ext/gecode-2.1.1/gecode/gist/nodevisitor.hh +91 -0
  109. data/ext/gecode-2.1.1/gecode/gist/nodevisitor.icc +112 -0
  110. data/ext/gecode-2.1.1/gecode/gist/postscript.cc +543 -0
  111. data/ext/gecode-2.1.1/gecode/gist/postscript.hh +56 -0
  112. data/ext/gecode-2.1.1/gecode/gist/preferences.cc +110 -0
  113. data/ext/gecode-2.1.1/gecode/gist/preferences.hh +76 -0
  114. data/ext/gecode-2.1.1/gecode/gist/reflectionhelpers.cc +55 -0
  115. data/ext/gecode-2.1.1/gecode/gist/reflectionhelpers.hh +58 -0
  116. data/ext/gecode-2.1.1/gecode/gist/shapelist.cc +331 -0
  117. data/ext/gecode-2.1.1/gecode/gist/shapelist.hh +140 -0
  118. data/ext/gecode-2.1.1/gecode/gist/spacenode.cc +531 -0
  119. data/ext/gecode-2.1.1/gecode/gist/spacenode.hh +224 -0
  120. data/ext/gecode-2.1.1/gecode/gist/test.cc +78 -0
  121. data/ext/gecode-2.1.1/gecode/gist/textoutput.cc +114 -0
  122. data/ext/gecode-2.1.1/gecode/gist/textoutput.hh +67 -0
  123. data/ext/gecode-2.1.1/gecode/gist/treecanvas.cc +1140 -0
  124. data/ext/gecode-2.1.1/gecode/gist/treecanvas.hh +324 -0
  125. data/ext/gecode-2.1.1/gecode/gist/ui_addchild.hh +163 -0
  126. data/ext/gecode-2.1.1/gecode/gist/ui_addvisualisationdialog.hh +163 -0
  127. data/ext/gecode-2.1.1/gecode/gist/visualisation/intvaritem.cc +175 -0
  128. data/ext/gecode-2.1.1/gecode/gist/visualisation/intvaritem.hh +71 -0
  129. data/ext/gecode-2.1.1/gecode/gist/visualisation/setvaritem.cc +219 -0
  130. data/ext/gecode-2.1.1/gecode/gist/visualisation/setvaritem.hh +73 -0
  131. data/ext/gecode-2.1.1/gecode/gist/visualisation/vararrayitem.hh +123 -0
  132. data/ext/gecode-2.1.1/gecode/gist/visualisation/vararrayview.cc +146 -0
  133. data/ext/gecode-2.1.1/gecode/gist/visualisation/vararrayview.hh +96 -0
  134. data/ext/gecode-2.1.1/gecode/gist/visualisation/vararrayviewt.hh +105 -0
  135. data/ext/gecode-2.1.1/gecode/gist/visualisation/varitem.cc +68 -0
  136. data/ext/gecode-2.1.1/gecode/gist/visualisation/varitem.hh +67 -0
  137. data/ext/gecode-2.1.1/gecode/gist/visualnode.cc +303 -0
  138. data/ext/gecode-2.1.1/gecode/gist/visualnode.hh +166 -0
  139. data/ext/gecode-2.1.1/gecode/int.hh +2035 -0
  140. data/ext/gecode-2.1.1/gecode/int/arithmetic.cc +136 -0
  141. data/ext/gecode-2.1.1/gecode/int/arithmetic.hh +440 -0
  142. data/ext/gecode-2.1.1/gecode/int/arithmetic/abs.icc +279 -0
  143. data/ext/gecode-2.1.1/gecode/int/arithmetic/max.icc +253 -0
  144. data/ext/gecode-2.1.1/gecode/int/arithmetic/mult.icc +522 -0
  145. data/ext/gecode-2.1.1/gecode/int/arithmetic/sqr.icc +218 -0
  146. data/ext/gecode-2.1.1/gecode/int/arithmetic/sqrt.icc +138 -0
  147. data/ext/gecode-2.1.1/gecode/int/array.cc +74 -0
  148. data/ext/gecode-2.1.1/gecode/int/array.icc +115 -0
  149. data/ext/gecode-2.1.1/gecode/int/bool.cc +642 -0
  150. data/ext/gecode-2.1.1/gecode/int/bool.hh +487 -0
  151. data/ext/gecode-2.1.1/gecode/int/bool/base.icc +156 -0
  152. data/ext/gecode-2.1.1/gecode/int/bool/eq.icc +239 -0
  153. data/ext/gecode-2.1.1/gecode/int/bool/eqv.icc +179 -0
  154. data/ext/gecode-2.1.1/gecode/int/bool/lq.icc +147 -0
  155. data/ext/gecode-2.1.1/gecode/int/bool/or.icc +1000 -0
  156. data/ext/gecode-2.1.1/gecode/int/branch.cc +301 -0
  157. data/ext/gecode-2.1.1/gecode/int/branch.hh +576 -0
  158. data/ext/gecode-2.1.1/gecode/int/branch/select-val.icc +338 -0
  159. data/ext/gecode-2.1.1/gecode/int/branch/select-view.icc +421 -0
  160. data/ext/gecode-2.1.1/gecode/int/channel.cc +114 -0
  161. data/ext/gecode-2.1.1/gecode/int/channel.hh +259 -0
  162. data/ext/gecode-2.1.1/gecode/int/channel/base.icc +86 -0
  163. data/ext/gecode-2.1.1/gecode/int/channel/dom.icc +347 -0
  164. data/ext/gecode-2.1.1/gecode/int/channel/link-multi.cc +231 -0
  165. data/ext/gecode-2.1.1/gecode/int/channel/link-multi.icc +70 -0
  166. data/ext/gecode-2.1.1/gecode/int/channel/link-single.cc +97 -0
  167. data/ext/gecode-2.1.1/gecode/int/channel/link-single.icc +71 -0
  168. data/ext/gecode-2.1.1/gecode/int/channel/val.icc +276 -0
  169. data/ext/gecode-2.1.1/gecode/int/circuit.cc +63 -0
  170. data/ext/gecode-2.1.1/gecode/int/circuit.hh +175 -0
  171. data/ext/gecode-2.1.1/gecode/int/circuit/base.icc +271 -0
  172. data/ext/gecode-2.1.1/gecode/int/circuit/dom.icc +146 -0
  173. data/ext/gecode-2.1.1/gecode/int/circuit/val.icc +122 -0
  174. data/ext/gecode-2.1.1/gecode/int/count.cc +310 -0
  175. data/ext/gecode-2.1.1/gecode/int/count.hh +487 -0
  176. data/ext/gecode-2.1.1/gecode/int/count/int.icc +619 -0
  177. data/ext/gecode-2.1.1/gecode/int/count/rel.icc +144 -0
  178. data/ext/gecode-2.1.1/gecode/int/count/view.icc +449 -0
  179. data/ext/gecode-2.1.1/gecode/int/cumulatives.cc +226 -0
  180. data/ext/gecode-2.1.1/gecode/int/cumulatives.hh +141 -0
  181. data/ext/gecode-2.1.1/gecode/int/cumulatives/val.icc +429 -0
  182. data/ext/gecode-2.1.1/gecode/int/distinct.cc +108 -0
  183. data/ext/gecode-2.1.1/gecode/int/distinct.hh +341 -0
  184. data/ext/gecode-2.1.1/gecode/int/distinct/bilink.icc +89 -0
  185. data/ext/gecode-2.1.1/gecode/int/distinct/bnd.icc +378 -0
  186. data/ext/gecode-2.1.1/gecode/int/distinct/combptr.icc +78 -0
  187. data/ext/gecode-2.1.1/gecode/int/distinct/dom.icc +750 -0
  188. data/ext/gecode-2.1.1/gecode/int/distinct/edge.icc +118 -0
  189. data/ext/gecode-2.1.1/gecode/int/distinct/node.icc +147 -0
  190. data/ext/gecode-2.1.1/gecode/int/distinct/ter-dom.icc +136 -0
  191. data/ext/gecode-2.1.1/gecode/int/distinct/val.icc +209 -0
  192. data/ext/gecode-2.1.1/gecode/int/dom.cc +116 -0
  193. data/ext/gecode-2.1.1/gecode/int/dom.hh +134 -0
  194. data/ext/gecode-2.1.1/gecode/int/dom/range.icc +129 -0
  195. data/ext/gecode-2.1.1/gecode/int/dom/spec.icc +151 -0
  196. data/ext/gecode-2.1.1/gecode/int/element.cc +156 -0
  197. data/ext/gecode-2.1.1/gecode/int/element.hh +239 -0
  198. data/ext/gecode-2.1.1/gecode/int/element/int.icc +441 -0
  199. data/ext/gecode-2.1.1/gecode/int/element/view.icc +584 -0
  200. data/ext/gecode-2.1.1/gecode/int/exception.icc +163 -0
  201. data/ext/gecode-2.1.1/gecode/int/extensional.cc +138 -0
  202. data/ext/gecode-2.1.1/gecode/int/extensional.hh +415 -0
  203. data/ext/gecode-2.1.1/gecode/int/extensional/base.icc +160 -0
  204. data/ext/gecode-2.1.1/gecode/int/extensional/basic.icc +166 -0
  205. data/ext/gecode-2.1.1/gecode/int/extensional/bitset.icc +113 -0
  206. data/ext/gecode-2.1.1/gecode/int/extensional/dfa.cc +565 -0
  207. data/ext/gecode-2.1.1/gecode/int/extensional/dfa.icc +241 -0
  208. data/ext/gecode-2.1.1/gecode/int/extensional/incremental.icc +393 -0
  209. data/ext/gecode-2.1.1/gecode/int/extensional/layered-graph.icc +604 -0
  210. data/ext/gecode-2.1.1/gecode/int/extensional/tuple-set.cc +311 -0
  211. data/ext/gecode-2.1.1/gecode/int/extensional/tuple-set.icc +207 -0
  212. data/ext/gecode-2.1.1/gecode/int/gcc.cc +374 -0
  213. data/ext/gecode-2.1.1/gecode/int/gcc.hh +329 -0
  214. data/ext/gecode-2.1.1/gecode/int/gcc/bnd.icc +660 -0
  215. data/ext/gecode-2.1.1/gecode/int/gcc/dom.icc +531 -0
  216. data/ext/gecode-2.1.1/gecode/int/gcc/gccbndsup.icc +780 -0
  217. data/ext/gecode-2.1.1/gecode/int/gcc/graphsup.icc +2422 -0
  218. data/ext/gecode-2.1.1/gecode/int/gcc/lbc.icc +391 -0
  219. data/ext/gecode-2.1.1/gecode/int/gcc/occur.icc +829 -0
  220. data/ext/gecode-2.1.1/gecode/int/gcc/ubc.icc +255 -0
  221. data/ext/gecode-2.1.1/gecode/int/gcc/val.icc +400 -0
  222. data/ext/gecode-2.1.1/gecode/int/int-set.cc +153 -0
  223. data/ext/gecode-2.1.1/gecode/int/int-set.icc +191 -0
  224. data/ext/gecode-2.1.1/gecode/int/limits.icc +54 -0
  225. data/ext/gecode-2.1.1/gecode/int/linear-bool.cc +220 -0
  226. data/ext/gecode-2.1.1/gecode/int/linear-int.cc +240 -0
  227. data/ext/gecode-2.1.1/gecode/int/linear.hh +1849 -0
  228. data/ext/gecode-2.1.1/gecode/int/linear/bool-int.icc +791 -0
  229. data/ext/gecode-2.1.1/gecode/int/linear/bool-post.cc +433 -0
  230. data/ext/gecode-2.1.1/gecode/int/linear/bool-scale.icc +854 -0
  231. data/ext/gecode-2.1.1/gecode/int/linear/bool-view.icc +399 -0
  232. data/ext/gecode-2.1.1/gecode/int/linear/int-bin.icc +605 -0
  233. data/ext/gecode-2.1.1/gecode/int/linear/int-dom.icc +539 -0
  234. data/ext/gecode-2.1.1/gecode/int/linear/int-nary.icc +1004 -0
  235. data/ext/gecode-2.1.1/gecode/int/linear/int-noview.icc +385 -0
  236. data/ext/gecode-2.1.1/gecode/int/linear/int-post.cc +493 -0
  237. data/ext/gecode-2.1.1/gecode/int/linear/int-ter.icc +357 -0
  238. data/ext/gecode-2.1.1/gecode/int/linear/post.icc +146 -0
  239. data/ext/gecode-2.1.1/gecode/int/propagator.icc +240 -0
  240. data/ext/gecode-2.1.1/gecode/int/rel.cc +431 -0
  241. data/ext/gecode-2.1.1/gecode/int/rel.hh +657 -0
  242. data/ext/gecode-2.1.1/gecode/int/rel/eq.icc +848 -0
  243. data/ext/gecode-2.1.1/gecode/int/rel/lex.icc +248 -0
  244. data/ext/gecode-2.1.1/gecode/int/rel/lq-le.icc +352 -0
  245. data/ext/gecode-2.1.1/gecode/int/rel/nq.icc +269 -0
  246. data/ext/gecode-2.1.1/gecode/int/sorted.cc +91 -0
  247. data/ext/gecode-2.1.1/gecode/int/sorted.hh +117 -0
  248. data/ext/gecode-2.1.1/gecode/int/sorted/matching.icc +182 -0
  249. data/ext/gecode-2.1.1/gecode/int/sorted/narrowing.icc +257 -0
  250. data/ext/gecode-2.1.1/gecode/int/sorted/order.icc +208 -0
  251. data/ext/gecode-2.1.1/gecode/int/sorted/propagate.icc +669 -0
  252. data/ext/gecode-2.1.1/gecode/int/sorted/sortsup.icc +596 -0
  253. data/ext/gecode-2.1.1/gecode/int/unshare.cc +148 -0
  254. data/ext/gecode-2.1.1/gecode/int/var-imp.icc +745 -0
  255. data/ext/gecode-2.1.1/gecode/int/var-imp/bool.cc +104 -0
  256. data/ext/gecode-2.1.1/gecode/int/var-imp/bool.icc +423 -0
  257. data/ext/gecode-2.1.1/gecode/int/var-imp/bool.vis +69 -0
  258. data/ext/gecode-2.1.1/gecode/int/var-imp/delta.icc +64 -0
  259. data/ext/gecode-2.1.1/gecode/int/var-imp/int.cc +407 -0
  260. data/ext/gecode-2.1.1/gecode/int/var-imp/int.icc +1004 -0
  261. data/ext/gecode-2.1.1/gecode/int/var-imp/int.vis +195 -0
  262. data/ext/gecode-2.1.1/gecode/int/var/bool.cc +72 -0
  263. data/ext/gecode-2.1.1/gecode/int/var/bool.icc +126 -0
  264. data/ext/gecode-2.1.1/gecode/int/var/int.cc +79 -0
  265. data/ext/gecode-2.1.1/gecode/int/var/int.icc +151 -0
  266. data/ext/gecode-2.1.1/gecode/int/view.icc +1894 -0
  267. data/ext/gecode-2.1.1/gecode/int/view/bool.icc +598 -0
  268. data/ext/gecode-2.1.1/gecode/int/view/constint.icc +392 -0
  269. data/ext/gecode-2.1.1/gecode/int/view/int.icc +301 -0
  270. data/ext/gecode-2.1.1/gecode/int/view/iter.icc +65 -0
  271. data/ext/gecode-2.1.1/gecode/int/view/minus.icc +372 -0
  272. data/ext/gecode-2.1.1/gecode/int/view/offset.icc +362 -0
  273. data/ext/gecode-2.1.1/gecode/int/view/print.cc +133 -0
  274. data/ext/gecode-2.1.1/gecode/int/view/rtest.icc +231 -0
  275. data/ext/gecode-2.1.1/gecode/int/view/scale.icc +456 -0
  276. data/ext/gecode-2.1.1/gecode/int/view/zero.icc +384 -0
  277. data/ext/gecode-2.1.1/gecode/iter.hh +90 -0
  278. data/ext/gecode-2.1.1/gecode/iter/ranges-add.icc +144 -0
  279. data/ext/gecode-2.1.1/gecode/iter/ranges-append.icc +222 -0
  280. data/ext/gecode-2.1.1/gecode/iter/ranges-array.icc +138 -0
  281. data/ext/gecode-2.1.1/gecode/iter/ranges-cache.icc +337 -0
  282. data/ext/gecode-2.1.1/gecode/iter/ranges-compl.icc +220 -0
  283. data/ext/gecode-2.1.1/gecode/iter/ranges-diff.icc +142 -0
  284. data/ext/gecode-2.1.1/gecode/iter/ranges-empty.icc +111 -0
  285. data/ext/gecode-2.1.1/gecode/iter/ranges-inter.icc +216 -0
  286. data/ext/gecode-2.1.1/gecode/iter/ranges-minmax.icc +118 -0
  287. data/ext/gecode-2.1.1/gecode/iter/ranges-minus.icc +150 -0
  288. data/ext/gecode-2.1.1/gecode/iter/ranges-offset.icc +127 -0
  289. data/ext/gecode-2.1.1/gecode/iter/ranges-operations.icc +157 -0
  290. data/ext/gecode-2.1.1/gecode/iter/ranges-scale.icc +238 -0
  291. data/ext/gecode-2.1.1/gecode/iter/ranges-singleton-append.icc +111 -0
  292. data/ext/gecode-2.1.1/gecode/iter/ranges-singleton.icc +86 -0
  293. data/ext/gecode-2.1.1/gecode/iter/ranges-size.icc +146 -0
  294. data/ext/gecode-2.1.1/gecode/iter/ranges-union.icc +224 -0
  295. data/ext/gecode-2.1.1/gecode/iter/ranges-values.icc +140 -0
  296. data/ext/gecode-2.1.1/gecode/iter/values-array.icc +119 -0
  297. data/ext/gecode-2.1.1/gecode/iter/values-minus.icc +130 -0
  298. data/ext/gecode-2.1.1/gecode/iter/values-offset.icc +113 -0
  299. data/ext/gecode-2.1.1/gecode/iter/values-ranges.icc +106 -0
  300. data/ext/gecode-2.1.1/gecode/iter/values-singleton.icc +109 -0
  301. data/ext/gecode-2.1.1/gecode/iter/values-unique.icc +118 -0
  302. data/ext/gecode-2.1.1/gecode/iter/virtual-ranges-compl.icc +261 -0
  303. data/ext/gecode-2.1.1/gecode/iter/virtual-ranges-inter.icc +241 -0
  304. data/ext/gecode-2.1.1/gecode/iter/virtual-ranges-union.icc +249 -0
  305. data/ext/gecode-2.1.1/gecode/iter/virtual-ranges.icc +140 -0
  306. data/ext/gecode-2.1.1/gecode/kernel.hh +182 -0
  307. data/ext/gecode-2.1.1/gecode/kernel/advisor.icc +104 -0
  308. data/ext/gecode-2.1.1/gecode/kernel/array.icc +1232 -0
  309. data/ext/gecode-2.1.1/gecode/kernel/branching.icc +447 -0
  310. data/ext/gecode-2.1.1/gecode/kernel/core.cc +473 -0
  311. data/ext/gecode-2.1.1/gecode/kernel/core.icc +2295 -0
  312. data/ext/gecode-2.1.1/gecode/kernel/exception.icc +101 -0
  313. data/ext/gecode-2.1.1/gecode/kernel/macros.icc +117 -0
  314. data/ext/gecode-2.1.1/gecode/kernel/memory-manager.cc +57 -0
  315. data/ext/gecode-2.1.1/gecode/kernel/memory-manager.icc +458 -0
  316. data/ext/gecode-2.1.1/gecode/kernel/modevent.icc +69 -0
  317. data/ext/gecode-2.1.1/gecode/kernel/propagator.icc +845 -0
  318. data/ext/gecode-2.1.1/gecode/kernel/reflection.cc +921 -0
  319. data/ext/gecode-2.1.1/gecode/kernel/reflection.icc +1012 -0
  320. data/ext/gecode-2.1.1/gecode/kernel/shared-array.icc +286 -0
  321. data/ext/gecode-2.1.1/gecode/kernel/var-imp.icc +433 -0
  322. data/ext/gecode-2.1.1/gecode/kernel/var-map.cc +269 -0
  323. data/ext/gecode-2.1.1/gecode/kernel/var-map.icc +227 -0
  324. data/ext/gecode-2.1.1/gecode/kernel/var-traits.icc +72 -0
  325. data/ext/gecode-2.1.1/gecode/kernel/var-type.cc +68 -0
  326. data/ext/gecode-2.1.1/gecode/kernel/var-type.icc +915 -0
  327. data/ext/gecode-2.1.1/gecode/kernel/var.icc +120 -0
  328. data/ext/gecode-2.1.1/gecode/kernel/view.icc +611 -0
  329. data/ext/gecode-2.1.1/gecode/minimodel.hh +1165 -0
  330. data/ext/gecode-2.1.1/gecode/minimodel/arithmetic.cc +179 -0
  331. data/ext/gecode-2.1.1/gecode/minimodel/bool-expr.cc +327 -0
  332. data/ext/gecode-2.1.1/gecode/minimodel/bool-expr.icc +131 -0
  333. data/ext/gecode-2.1.1/gecode/minimodel/bool-rel.icc +83 -0
  334. data/ext/gecode-2.1.1/gecode/minimodel/exception.icc +84 -0
  335. data/ext/gecode-2.1.1/gecode/minimodel/lin-expr.icc +374 -0
  336. data/ext/gecode-2.1.1/gecode/minimodel/lin-rel.icc +324 -0
  337. data/ext/gecode-2.1.1/gecode/minimodel/matrix.icc +144 -0
  338. data/ext/gecode-2.1.1/gecode/minimodel/reg.cc +823 -0
  339. data/ext/gecode-2.1.1/gecode/search.hh +752 -0
  340. data/ext/gecode-2.1.1/gecode/search/bab.cc +169 -0
  341. data/ext/gecode-2.1.1/gecode/search/bab.icc +117 -0
  342. data/ext/gecode-2.1.1/gecode/search/dfs.cc +79 -0
  343. data/ext/gecode-2.1.1/gecode/search/dfs.icc +169 -0
  344. data/ext/gecode-2.1.1/gecode/search/engine-ctrl.icc +131 -0
  345. data/ext/gecode-2.1.1/gecode/search/lds.cc +265 -0
  346. data/ext/gecode-2.1.1/gecode/search/lds.icc +73 -0
  347. data/ext/gecode-2.1.1/gecode/search/options.cc +46 -0
  348. data/ext/gecode-2.1.1/gecode/search/options.icc +46 -0
  349. data/ext/gecode-2.1.1/gecode/search/reco-stack.icc +237 -0
  350. data/ext/gecode-2.1.1/gecode/search/restart.icc +99 -0
  351. data/ext/gecode-2.1.1/gecode/search/statistics.icc +46 -0
  352. data/ext/gecode-2.1.1/gecode/search/stop.cc +74 -0
  353. data/ext/gecode-2.1.1/gecode/search/stop.icc +116 -0
  354. data/ext/gecode-2.1.1/gecode/serialization.hh +149 -0
  355. data/ext/gecode-2.1.1/gecode/serialization/boost.cc +78 -0
  356. data/ext/gecode-2.1.1/gecode/serialization/boost.icc +381 -0
  357. data/ext/gecode-2.1.1/gecode/serialization/flatzinc.cc +372 -0
  358. data/ext/gecode-2.1.1/gecode/serialization/javascript.cc +340 -0
  359. data/ext/gecode-2.1.1/gecode/serialization/javascript.hh +69 -0
  360. data/ext/gecode-2.1.1/gecode/serialization/register.cc +8142 -0
  361. data/ext/gecode-2.1.1/gecode/set.hh +970 -0
  362. data/ext/gecode-2.1.1/gecode/set/array.cc +114 -0
  363. data/ext/gecode-2.1.1/gecode/set/array.icc +77 -0
  364. data/ext/gecode-2.1.1/gecode/set/branch.cc +78 -0
  365. data/ext/gecode-2.1.1/gecode/set/branch.hh +213 -0
  366. data/ext/gecode-2.1.1/gecode/set/branch/select-val.icc +132 -0
  367. data/ext/gecode-2.1.1/gecode/set/branch/select-view.icc +148 -0
  368. data/ext/gecode-2.1.1/gecode/set/cardinality.cc +65 -0
  369. data/ext/gecode-2.1.1/gecode/set/convex.cc +59 -0
  370. data/ext/gecode-2.1.1/gecode/set/convex.hh +126 -0
  371. data/ext/gecode-2.1.1/gecode/set/convex/conv.cc +118 -0
  372. data/ext/gecode-2.1.1/gecode/set/convex/conv.icc +67 -0
  373. data/ext/gecode-2.1.1/gecode/set/convex/hull.cc +140 -0
  374. data/ext/gecode-2.1.1/gecode/set/convex/hull.icc +68 -0
  375. data/ext/gecode-2.1.1/gecode/set/distinct.cc +56 -0
  376. data/ext/gecode-2.1.1/gecode/set/distinct.hh +90 -0
  377. data/ext/gecode-2.1.1/gecode/set/distinct/atmostOne.cc +192 -0
  378. data/ext/gecode-2.1.1/gecode/set/distinct/atmostOne.icc +66 -0
  379. data/ext/gecode-2.1.1/gecode/set/dom.cc +232 -0
  380. data/ext/gecode-2.1.1/gecode/set/exception.icc +135 -0
  381. data/ext/gecode-2.1.1/gecode/set/int.cc +177 -0
  382. data/ext/gecode-2.1.1/gecode/set/int.hh +391 -0
  383. data/ext/gecode-2.1.1/gecode/set/int/card.icc +116 -0
  384. data/ext/gecode-2.1.1/gecode/set/int/channel-bool.icc +303 -0
  385. data/ext/gecode-2.1.1/gecode/set/int/channel-int.icc +174 -0
  386. data/ext/gecode-2.1.1/gecode/set/int/match.icc +224 -0
  387. data/ext/gecode-2.1.1/gecode/set/int/minmax.icc +228 -0
  388. data/ext/gecode-2.1.1/gecode/set/int/weights.icc +370 -0
  389. data/ext/gecode-2.1.1/gecode/set/limits.icc +62 -0
  390. data/ext/gecode-2.1.1/gecode/set/projectors-compiler.hh +164 -0
  391. data/ext/gecode-2.1.1/gecode/set/projectors.cc +143 -0
  392. data/ext/gecode-2.1.1/gecode/set/projectors.hh +438 -0
  393. data/ext/gecode-2.1.1/gecode/set/projectors/compiler.cc +859 -0
  394. data/ext/gecode-2.1.1/gecode/set/projectors/formula.cc +312 -0
  395. data/ext/gecode-2.1.1/gecode/set/projectors/formula.icc +66 -0
  396. data/ext/gecode-2.1.1/gecode/set/projectors/projector-set.cc +91 -0
  397. data/ext/gecode-2.1.1/gecode/set/projectors/projector-set.icc +85 -0
  398. data/ext/gecode-2.1.1/gecode/set/projectors/projector.cc +147 -0
  399. data/ext/gecode-2.1.1/gecode/set/projectors/projector.icc +98 -0
  400. data/ext/gecode-2.1.1/gecode/set/projectors/propagator.hh +168 -0
  401. data/ext/gecode-2.1.1/gecode/set/projectors/propagator/card.icc +128 -0
  402. data/ext/gecode-2.1.1/gecode/set/projectors/propagator/nary.icc +144 -0
  403. data/ext/gecode-2.1.1/gecode/set/projectors/propagator/re-nary.cc +100 -0
  404. data/ext/gecode-2.1.1/gecode/set/projectors/propagator/re-nary.icc +71 -0
  405. data/ext/gecode-2.1.1/gecode/set/projectors/set-expr.cc +339 -0
  406. data/ext/gecode-2.1.1/gecode/set/projectors/set-expr.icc +237 -0
  407. data/ext/gecode-2.1.1/gecode/set/propagator.icc +125 -0
  408. data/ext/gecode-2.1.1/gecode/set/rel-op-const.cc +332 -0
  409. data/ext/gecode-2.1.1/gecode/set/rel-op.cc +197 -0
  410. data/ext/gecode-2.1.1/gecode/set/rel-op.hh +353 -0
  411. data/ext/gecode-2.1.1/gecode/set/rel-op/common.icc +557 -0
  412. data/ext/gecode-2.1.1/gecode/set/rel-op/inter.icc +409 -0
  413. data/ext/gecode-2.1.1/gecode/set/rel-op/partition.icc +202 -0
  414. data/ext/gecode-2.1.1/gecode/set/rel-op/post.icc +223 -0
  415. data/ext/gecode-2.1.1/gecode/set/rel-op/subofunion.icc +192 -0
  416. data/ext/gecode-2.1.1/gecode/set/rel-op/superofinter.icc +193 -0
  417. data/ext/gecode-2.1.1/gecode/set/rel-op/union.icc +383 -0
  418. data/ext/gecode-2.1.1/gecode/set/rel.cc +258 -0
  419. data/ext/gecode-2.1.1/gecode/set/rel.hh +321 -0
  420. data/ext/gecode-2.1.1/gecode/set/rel/common.icc +125 -0
  421. data/ext/gecode-2.1.1/gecode/set/rel/eq.icc +139 -0
  422. data/ext/gecode-2.1.1/gecode/set/rel/nosubset.icc +128 -0
  423. data/ext/gecode-2.1.1/gecode/set/rel/nq.icc +208 -0
  424. data/ext/gecode-2.1.1/gecode/set/rel/re-eq.icc +179 -0
  425. data/ext/gecode-2.1.1/gecode/set/rel/re-subset.icc +172 -0
  426. data/ext/gecode-2.1.1/gecode/set/rel/subset.icc +119 -0
  427. data/ext/gecode-2.1.1/gecode/set/select.cc +135 -0
  428. data/ext/gecode-2.1.1/gecode/set/select.hh +233 -0
  429. data/ext/gecode-2.1.1/gecode/set/select/disjoint.cc +308 -0
  430. data/ext/gecode-2.1.1/gecode/set/select/disjoint.icc +75 -0
  431. data/ext/gecode-2.1.1/gecode/set/select/idxarray.hh +113 -0
  432. data/ext/gecode-2.1.1/gecode/set/select/idxarray.icc +155 -0
  433. data/ext/gecode-2.1.1/gecode/set/select/inter.icc +349 -0
  434. data/ext/gecode-2.1.1/gecode/set/select/union.icc +371 -0
  435. data/ext/gecode-2.1.1/gecode/set/select/unionConst.icc +334 -0
  436. data/ext/gecode-2.1.1/gecode/set/sequence.cc +69 -0
  437. data/ext/gecode-2.1.1/gecode/set/sequence.hh +134 -0
  438. data/ext/gecode-2.1.1/gecode/set/sequence/common.icc +99 -0
  439. data/ext/gecode-2.1.1/gecode/set/sequence/seq-u.cc +176 -0
  440. data/ext/gecode-2.1.1/gecode/set/sequence/seq-u.icc +79 -0
  441. data/ext/gecode-2.1.1/gecode/set/sequence/seq.cc +94 -0
  442. data/ext/gecode-2.1.1/gecode/set/sequence/seq.icc +69 -0
  443. data/ext/gecode-2.1.1/gecode/set/var-imp.icc +737 -0
  444. data/ext/gecode-2.1.1/gecode/set/var-imp/delta.icc +78 -0
  445. data/ext/gecode-2.1.1/gecode/set/var-imp/integerset.cc +349 -0
  446. data/ext/gecode-2.1.1/gecode/set/var-imp/integerset.icc +484 -0
  447. data/ext/gecode-2.1.1/gecode/set/var-imp/iter.icc +63 -0
  448. data/ext/gecode-2.1.1/gecode/set/var-imp/set.cc +214 -0
  449. data/ext/gecode-2.1.1/gecode/set/var-imp/set.icc +532 -0
  450. data/ext/gecode-2.1.1/gecode/set/var-imp/set.vis +190 -0
  451. data/ext/gecode-2.1.1/gecode/set/var/set.cc +105 -0
  452. data/ext/gecode-2.1.1/gecode/set/var/set.icc +303 -0
  453. data/ext/gecode-2.1.1/gecode/set/view.icc +1503 -0
  454. data/ext/gecode-2.1.1/gecode/set/view/complement.icc +629 -0
  455. data/ext/gecode-2.1.1/gecode/set/view/const.icc +907 -0
  456. data/ext/gecode-2.1.1/gecode/set/view/offset.icc +497 -0
  457. data/ext/gecode-2.1.1/gecode/set/view/print.cc +141 -0
  458. data/ext/gecode-2.1.1/gecode/set/view/set.icc +275 -0
  459. data/ext/gecode-2.1.1/gecode/set/view/singleton.icc +438 -0
  460. data/ext/gecode-2.1.1/gecode/support.hh +110 -0
  461. data/ext/gecode-2.1.1/gecode/support/block-allocator.icc +158 -0
  462. data/ext/gecode-2.1.1/gecode/support/buddy/AUTHORS +11 -0
  463. data/ext/gecode-2.1.1/gecode/support/buddy/ChangeLog +218 -0
  464. data/ext/gecode-2.1.1/gecode/support/buddy/NEWS +200 -0
  465. data/ext/gecode-2.1.1/gecode/support/buddy/README +128 -0
  466. data/ext/gecode-2.1.1/gecode/support/buddy/bdd.h +939 -0
  467. data/ext/gecode-2.1.1/gecode/support/buddy/bddio.c +596 -0
  468. data/ext/gecode-2.1.1/gecode/support/buddy/bddop.c +2848 -0
  469. data/ext/gecode-2.1.1/gecode/support/buddy/bddtree.h +62 -0
  470. data/ext/gecode-2.1.1/gecode/support/buddy/bvec.c +1354 -0
  471. data/ext/gecode-2.1.1/gecode/support/buddy/bvec.h +298 -0
  472. data/ext/gecode-2.1.1/gecode/support/buddy/cache.c +104 -0
  473. data/ext/gecode-2.1.1/gecode/support/buddy/cache.h +72 -0
  474. data/ext/gecode-2.1.1/gecode/support/buddy/config.h +20 -0
  475. data/ext/gecode-2.1.1/gecode/support/buddy/cppext.cc +626 -0
  476. data/ext/gecode-2.1.1/gecode/support/buddy/fdd.c +1079 -0
  477. data/ext/gecode-2.1.1/gecode/support/buddy/fdd.h +175 -0
  478. data/ext/gecode-2.1.1/gecode/support/buddy/imatrix.c +151 -0
  479. data/ext/gecode-2.1.1/gecode/support/buddy/imatrix.h +61 -0
  480. data/ext/gecode-2.1.1/gecode/support/buddy/kernel.c +1555 -0
  481. data/ext/gecode-2.1.1/gecode/support/buddy/kernel.h +244 -0
  482. data/ext/gecode-2.1.1/gecode/support/buddy/pairs.c +336 -0
  483. data/ext/gecode-2.1.1/gecode/support/buddy/prime.c +322 -0
  484. data/ext/gecode-2.1.1/gecode/support/buddy/prime.h +50 -0
  485. data/ext/gecode-2.1.1/gecode/support/buddy/reorder.c +2345 -0
  486. data/ext/gecode-2.1.1/gecode/support/buddy/tree.c +224 -0
  487. data/ext/gecode-2.1.1/gecode/support/cast.icc +52 -0
  488. data/ext/gecode-2.1.1/gecode/support/config.icc.in +80 -0
  489. data/ext/gecode-2.1.1/gecode/support/dynamic-array.icc +138 -0
  490. data/ext/gecode-2.1.1/gecode/support/dynamic-stack.icc +167 -0
  491. data/ext/gecode-2.1.1/gecode/support/exception.cc +65 -0
  492. data/ext/gecode-2.1.1/gecode/support/exception.icc +82 -0
  493. data/ext/gecode-2.1.1/gecode/support/macros.icc +103 -0
  494. data/ext/gecode-2.1.1/gecode/support/map.icc +207 -0
  495. data/ext/gecode-2.1.1/gecode/support/marked-pointer.icc +66 -0
  496. data/ext/gecode-2.1.1/gecode/support/memory.icc +220 -0
  497. data/ext/gecode-2.1.1/gecode/support/random.icc +121 -0
  498. data/ext/gecode-2.1.1/gecode/support/sentinel-stack.icc +122 -0
  499. data/ext/gecode-2.1.1/gecode/support/sort.icc +210 -0
  500. data/ext/gecode-2.1.1/gecode/support/static-pqueue.icc +242 -0
  501. data/ext/gecode-2.1.1/gecode/support/static-stack.icc +125 -0
  502. data/ext/gecode-2.1.1/gecode/support/symbol.cc +226 -0
  503. data/ext/gecode-2.1.1/gecode/support/symbol.icc +130 -0
  504. data/ext/{gecode-1.3.1 → gecode-2.1.1}/install-sh +0 -0
  505. data/ext/gecode-2.1.1/misc/AppleHelpbookInfo.plist +26 -0
  506. data/ext/gecode-2.1.1/misc/allexamples.perl +60 -0
  507. data/ext/gecode-2.1.1/misc/debian/Makefile.am +44 -0
  508. data/ext/{gecode-1.3.1 → gecode-2.1.1}/misc/debian/changelog +0 -0
  509. data/ext/{gecode-1.3.1 → gecode-2.1.1}/misc/debian/control +0 -0
  510. data/ext/gecode-2.1.1/misc/debian/copyright +30 -0
  511. data/ext/{gecode-1.3.1 → gecode-2.1.1}/misc/debian/gecode.info +0 -0
  512. data/ext/{gecode-1.3.1 → gecode-2.1.1}/misc/debian/gecode.install +0 -0
  513. data/ext/{gecode-1.3.1 → gecode-2.1.1}/misc/debian/gecode.spec +0 -0
  514. data/ext/{gecode-1.3.1 → gecode-2.1.1}/misc/debian/rules +0 -0
  515. data/ext/{gecode-1.3.1 → gecode-2.1.1}/misc/doxygen/back.png +0 -0
  516. data/ext/{gecode-1.3.1 → gecode-2.1.1}/misc/doxygen/footer.html +0 -0
  517. data/ext/{gecode-1.3.1 → gecode-2.1.1}/misc/doxygen/gecode-logo-100.png +0 -0
  518. data/ext/{gecode-1.3.1 → gecode-2.1.1}/misc/doxygen/header.html +0 -0
  519. data/ext/gecode-2.1.1/misc/doxygen/stylesheet.css +464 -0
  520. data/ext/gecode-2.1.1/misc/fixproperties.sh +77 -0
  521. data/ext/gecode-2.1.1/misc/gecode-gist.pc.in +45 -0
  522. data/ext/gecode-2.1.1/misc/gecode-minimodel.pc.in +45 -0
  523. data/ext/gecode-2.1.1/misc/gecode-search.pc.in +45 -0
  524. data/ext/gecode-2.1.1/misc/gecode-serialization.pc.in +45 -0
  525. data/ext/gecode-2.1.1/misc/gecode.pc.in +45 -0
  526. data/ext/gecode-2.1.1/misc/genchangelog.perl +208 -0
  527. data/ext/gecode-2.1.1/misc/genlcovmakefile.perl +148 -0
  528. data/ext/gecode-2.1.1/misc/genlicense.perl +121 -0
  529. data/ext/gecode-2.1.1/misc/genregistry.perl +468 -0
  530. data/ext/gecode-2.1.1/misc/genstatistics.perl +178 -0
  531. data/ext/gecode-2.1.1/misc/gentxtchangelog.perl +192 -0
  532. data/ext/gecode-2.1.1/misc/genvariables.perl +905 -0
  533. data/ext/gecode-2.1.1/misc/getrevision.perl +47 -0
  534. data/ext/gecode-2.1.1/misc/makedepend.perl +85 -0
  535. data/ext/gecode-2.1.1/misc/svn-ignore.txt +15 -0
  536. data/ext/gecode-2.1.1/variables.vsl +50 -0
  537. data/ext/missing.cpp +1 -1
  538. data/ext/missing.h +1 -1
  539. data/ext/vararray.h +4 -4
  540. data/lib/gecoder/bindings.rb +21 -1
  541. data/lib/gecoder/bindings/bindings.rb +408 -731
  542. data/lib/gecoder/interface/binding_changes.rb +1 -1
  543. data/lib/gecoder/interface/branch.rb +25 -25
  544. data/lib/gecoder/interface/constraints.rb +47 -4
  545. data/lib/gecoder/interface/constraints/bool/boolean.rb +18 -16
  546. data/lib/gecoder/interface/constraints/bool_enum/boolean.rb +13 -11
  547. data/lib/gecoder/interface/constraints/int/arithmetic.rb +5 -4
  548. data/lib/gecoder/interface/constraints/int/domain.rb +8 -9
  549. data/lib/gecoder/interface/constraints/int/linear.rb +10 -8
  550. data/lib/gecoder/interface/constraints/int_enum/arithmetic.rb +4 -4
  551. data/lib/gecoder/interface/constraints/int_enum/channel.rb +2 -2
  552. data/lib/gecoder/interface/constraints/int_enum/count.rb +4 -5
  553. data/lib/gecoder/interface/constraints/int_enum/distinct.rb +7 -2
  554. data/lib/gecoder/interface/constraints/int_enum/element.rb +2 -2
  555. data/lib/gecoder/interface/constraints/int_enum/equality.rb +6 -3
  556. data/lib/gecoder/interface/constraints/int_enum/sort.rb +17 -5
  557. data/lib/gecoder/interface/constraints/set_enum/distinct.rb +0 -36
  558. data/lib/gecoder/interface/constraints/set_var_constraints.rb +5 -0
  559. data/lib/gecoder/interface/model.rb +3 -3
  560. data/lib/gecoder/interface/search.rb +5 -4
  561. data/lib/gecoder/version.rb +1 -1
  562. data/specs/branch.rb +27 -27
  563. data/specs/constraints/arithmetic.rb +48 -30
  564. data/specs/constraints/bool_enum.rb +39 -19
  565. data/specs/constraints/boolean.rb +10 -10
  566. data/specs/constraints/cardinality.rb +12 -9
  567. data/specs/constraints/channel.rb +6 -6
  568. data/specs/constraints/connection.rb +22 -26
  569. data/specs/constraints/constraint_helper.rb +125 -41
  570. data/specs/constraints/count.rb +22 -15
  571. data/specs/constraints/distinct.rb +10 -64
  572. data/specs/constraints/element.rb +14 -12
  573. data/specs/constraints/equality.rb +4 -4
  574. data/specs/constraints/int_domain.rb +8 -7
  575. data/specs/constraints/int_relation.rb +12 -8
  576. data/specs/constraints/linear.rb +4 -4
  577. data/specs/constraints/reification_sugar.rb +22 -4
  578. data/specs/constraints/selection.rb +2 -2
  579. data/specs/constraints/set_domain.rb +7 -3
  580. data/specs/constraints/set_operation.rb +2 -2
  581. data/specs/constraints/set_relation.rb +2 -6
  582. data/specs/constraints/sort.rb +20 -16
  583. data/specs/distribution.rb +14 -0
  584. data/specs/model.rb +4 -4
  585. data/tasks/dependencies.txt +21 -0
  586. data/tasks/distribution.rake +49 -14
  587. data/vendor/rust/include/rust_checks.hh +2 -1
  588. data/vendor/rust/include/rust_conversions.hh +2 -2
  589. data/vendor/rust/rust/attribute.rb +2 -2
  590. data/vendor/rust/rust/class.rb +2 -2
  591. data/vendor/rust/rust/cxxclass.rb +0 -2
  592. data/vendor/rust/rust/function.rb +2 -2
  593. data/vendor/rust/rust/templates/AttributeDefinition.rusttpl +1 -1
  594. data/vendor/rust/rust/templates/StandaloneClassDeclarations.rusttpl +1 -1
  595. data/vendor/rust/rust/templates/VariableFunctionCall.rusttpl +1 -1
  596. data/vendor/rust/rust/type.rb +1 -1
  597. metadata +599 -542
  598. data/ext/gecode-1.3.1/LICENSE +0 -34
  599. data/ext/gecode-1.3.1/Makefile.contribs +0 -71
  600. data/ext/gecode-1.3.1/Makefile.dep +0 -3928
  601. data/ext/gecode-1.3.1/Makefile.in +0 -966
  602. data/ext/gecode-1.3.1/changelog.in +0 -1065
  603. data/ext/gecode-1.3.1/configure +0 -8590
  604. data/ext/gecode-1.3.1/configure.ac +0 -179
  605. data/ext/gecode-1.3.1/configure.ac.in +0 -175
  606. data/ext/gecode-1.3.1/contribs/graph/INSTALL +0 -53
  607. data/ext/gecode-1.3.1/contribs/graph/LICENSE +0 -11
  608. data/ext/gecode-1.3.1/contribs/graph/Makefile +0 -167
  609. data/ext/gecode-1.3.1/contribs/graph/Makefile.in.in +0 -169
  610. data/ext/gecode-1.3.1/contribs/graph/TODO +0 -28
  611. data/ext/gecode-1.3.1/contribs/graph/binarysimple.hh +0 -82
  612. data/ext/gecode-1.3.1/contribs/graph/binarysimple.icc +0 -186
  613. data/ext/gecode-1.3.1/contribs/graph/branch/branch.icc +0 -257
  614. data/ext/gecode-1.3.1/contribs/graph/configure +0 -2160
  615. data/ext/gecode-1.3.1/contribs/graph/configure.ac +0 -33
  616. data/ext/gecode-1.3.1/contribs/graph/doxygen.conf +0 -1226
  617. data/ext/gecode-1.3.1/contribs/graph/doxygen.hh +0 -132
  618. data/ext/gecode-1.3.1/contribs/graph/examples/cpgraph-basic.cc +0 -94
  619. data/ext/gecode-1.3.1/contribs/graph/examples/cpgraph-complement.cc +0 -104
  620. data/ext/gecode-1.3.1/contribs/graph/examples/cpgraph-instUB.cc +0 -105
  621. data/ext/gecode-1.3.1/contribs/graph/examples/cpgraph-path.cc +0 -92
  622. data/ext/gecode-1.3.1/contribs/graph/examples/cpgraph-path2.cc +0 -273
  623. data/ext/gecode-1.3.1/contribs/graph/examples/cpgraph-pathcost.cc +0 -311
  624. data/ext/gecode-1.3.1/contribs/graph/examples/g1.txt +0 -1
  625. data/ext/gecode-1.3.1/contribs/graph/examples/g2.txt +0 -1
  626. data/ext/gecode-1.3.1/contribs/graph/graph.hh +0 -51
  627. data/ext/gecode-1.3.1/contribs/graph/graphutils.h +0 -46
  628. data/ext/gecode-1.3.1/contribs/graph/graphutils.icc +0 -140
  629. data/ext/gecode-1.3.1/contribs/graph/misc/doxygen/footer.html +0 -1
  630. data/ext/gecode-1.3.1/contribs/graph/path.hh +0 -116
  631. data/ext/gecode-1.3.1/contribs/graph/path.icc +0 -64
  632. data/ext/gecode-1.3.1/contribs/graph/path/path.icc +0 -139
  633. data/ext/gecode-1.3.1/contribs/graph/path/pathdegree.icc +0 -133
  634. data/ext/gecode-1.3.1/contribs/graph/path/pathgraphs.icc +0 -341
  635. data/ext/gecode-1.3.1/contribs/graph/shortdesc.ac +0 -1
  636. data/ext/gecode-1.3.1/contribs/graph/stlutility.icc +0 -105
  637. data/ext/gecode-1.3.1/contribs/graph/var.icc +0 -106
  638. data/ext/gecode-1.3.1/contribs/graph/view.icc +0 -373
  639. data/ext/gecode-1.3.1/contribs/graph/view/arcnode.cc +0 -162
  640. data/ext/gecode-1.3.1/contribs/graph/view/arcnode.hh +0 -78
  641. data/ext/gecode-1.3.1/contribs/graph/view/boundsgraphs.icc +0 -349
  642. data/ext/gecode-1.3.1/contribs/graph/view/constant.icc +0 -148
  643. data/ext/gecode-1.3.1/contribs/graph/view/iter.icc +0 -337
  644. data/ext/gecode-1.3.1/contribs/graph/view/nodearcsets.icc +0 -493
  645. data/ext/gecode-1.3.1/contribs/graph/view/nodeset.icc +0 -60
  646. data/ext/gecode-1.3.1/contribs/graph/view/outadjsets.icc +0 -600
  647. data/ext/gecode-1.3.1/contribs/graph/view/prop.icc +0 -135
  648. data/ext/gecode-1.3.1/contribs/map/COMPILING +0 -68
  649. data/ext/gecode-1.3.1/contribs/map/LICENSE +0 -11
  650. data/ext/gecode-1.3.1/contribs/map/Makefile.in.in +0 -173
  651. data/ext/gecode-1.3.1/contribs/map/configure +0 -2285
  652. data/ext/gecode-1.3.1/contribs/map/configure.ac +0 -32
  653. data/ext/gecode-1.3.1/contribs/map/constraints.hh +0 -46
  654. data/ext/gecode-1.3.1/contribs/map/constraints.icc +0 -84
  655. data/ext/gecode-1.3.1/contribs/map/doxygen.conf +0 -1229
  656. data/ext/gecode-1.3.1/contribs/map/doxygen.hh +0 -33
  657. data/ext/gecode-1.3.1/contribs/map/examples/approximateMatching.cc +0 -199
  658. data/ext/gecode-1.3.1/contribs/map/examples/g1.txt +0 -1
  659. data/ext/gecode-1.3.1/contribs/map/examples/g2.txt +0 -1
  660. data/ext/gecode-1.3.1/contribs/map/examples/graph-examples.tgz +0 -0
  661. data/ext/gecode-1.3.1/contribs/map/examples/isomorphism.cc +0 -148
  662. data/ext/gecode-1.3.1/contribs/map/examples/map +0 -0
  663. data/ext/gecode-1.3.1/contribs/map/examples/map.cc +0 -80
  664. data/ext/gecode-1.3.1/contribs/map/examples/subgraphmonomorphism.cc +0 -155
  665. data/ext/gecode-1.3.1/contribs/map/map.hh +0 -65
  666. data/ext/gecode-1.3.1/contribs/map/matching/mono.hh +0 -235
  667. data/ext/gecode-1.3.1/contribs/map/matching/mono.icc +0 -771
  668. data/ext/gecode-1.3.1/contribs/map/shortdesc.ac +0 -2
  669. data/ext/gecode-1.3.1/contribs/map/var.icc +0 -346
  670. data/ext/gecode-1.3.1/contribs/map/var/imp.cc +0 -42
  671. data/ext/gecode-1.3.1/contribs/map/var/imp.icc +0 -436
  672. data/ext/gecode-1.3.1/doxygen.conf.in +0 -1225
  673. data/ext/gecode-1.3.1/doxygen.hh.in +0 -877
  674. data/ext/gecode-1.3.1/examples/all-interval-sort.cc +0 -201
  675. data/ext/gecode-1.3.1/examples/all-interval.cc +0 -114
  676. data/ext/gecode-1.3.1/examples/alpha.cc +0 -112
  677. data/ext/gecode-1.3.1/examples/baseline.cc +0 -71
  678. data/ext/gecode-1.3.1/examples/bibd.cc +0 -173
  679. data/ext/gecode-1.3.1/examples/black-hole.cc +0 -281
  680. data/ext/gecode-1.3.1/examples/cars.cc +0 -165
  681. data/ext/gecode-1.3.1/examples/crew.cc +0 -220
  682. data/ext/gecode-1.3.1/examples/crowded-chess.cc +0 -312
  683. data/ext/gecode-1.3.1/examples/donald.cc +0 -93
  684. data/ext/gecode-1.3.1/examples/eq20.cc +0 -111
  685. data/ext/gecode-1.3.1/examples/golf.cc +0 -242
  686. data/ext/gecode-1.3.1/examples/golomb.cc +0 -141
  687. data/ext/gecode-1.3.1/examples/graph-color.cc +0 -371
  688. data/ext/gecode-1.3.1/examples/grocery.cc +0 -107
  689. data/ext/gecode-1.3.1/examples/hamming.cc +0 -107
  690. data/ext/gecode-1.3.1/examples/ind-set.cc +0 -130
  691. data/ext/gecode-1.3.1/examples/knights.cc +0 -146
  692. data/ext/gecode-1.3.1/examples/langfordnum.cc +0 -244
  693. data/ext/gecode-1.3.1/examples/magic-sequence-gcc.cc +0 -93
  694. data/ext/gecode-1.3.1/examples/magic-sequence.cc +0 -108
  695. data/ext/gecode-1.3.1/examples/magic-square.cc +0 -120
  696. data/ext/gecode-1.3.1/examples/money.cc +0 -92
  697. data/ext/gecode-1.3.1/examples/ortho-latin.cc +0 -156
  698. data/ext/gecode-1.3.1/examples/packing.cc +0 -211
  699. data/ext/gecode-1.3.1/examples/partition.cc +0 -126
  700. data/ext/gecode-1.3.1/examples/photo.cc +0 -155
  701. data/ext/gecode-1.3.1/examples/picture-puzzle.cc +0 -481
  702. data/ext/gecode-1.3.1/examples/queen-armies.cc +0 -240
  703. data/ext/gecode-1.3.1/examples/queens.cc +0 -99
  704. data/ext/gecode-1.3.1/examples/sports-league.cc +0 -454
  705. data/ext/gecode-1.3.1/examples/steiner.cc +0 -148
  706. data/ext/gecode-1.3.1/examples/stress-domain.cc +0 -86
  707. data/ext/gecode-1.3.1/examples/stress-element.cc +0 -95
  708. data/ext/gecode-1.3.1/examples/stress-exec.cc +0 -74
  709. data/ext/gecode-1.3.1/examples/stress-min.cc +0 -84
  710. data/ext/gecode-1.3.1/examples/stress-search.cc +0 -72
  711. data/ext/gecode-1.3.1/examples/sudoku-mixed.cc +0 -282
  712. data/ext/gecode-1.3.1/examples/sudoku-set.cc +0 -162
  713. data/ext/gecode-1.3.1/examples/sudoku.cc +0 -188
  714. data/ext/gecode-1.3.1/examples/sudoku.icc +0 -703
  715. data/ext/gecode-1.3.1/examples/support.cc +0 -160
  716. data/ext/gecode-1.3.1/examples/support.hh +0 -98
  717. data/ext/gecode-1.3.1/examples/support.icc +0 -187
  718. data/ext/gecode-1.3.1/examples/timer.cc +0 -47
  719. data/ext/gecode-1.3.1/examples/timer.hh +0 -72
  720. data/ext/gecode-1.3.1/examples/warehouses.cc +0 -176
  721. data/ext/gecode-1.3.1/extconf.rb +0 -8
  722. data/ext/gecode-1.3.1/gecode.m4 +0 -736
  723. data/ext/gecode-1.3.1/gecode/config.icc.in +0 -50
  724. data/ext/gecode-1.3.1/gecode/int.hh +0 -1426
  725. data/ext/gecode-1.3.1/gecode/int/arithmetic.cc +0 -87
  726. data/ext/gecode-1.3.1/gecode/int/arithmetic.hh +0 -292
  727. data/ext/gecode-1.3.1/gecode/int/arithmetic/abs.icc +0 -213
  728. data/ext/gecode-1.3.1/gecode/int/arithmetic/max.icc +0 -196
  729. data/ext/gecode-1.3.1/gecode/int/arithmetic/mult.icc +0 -478
  730. data/ext/gecode-1.3.1/gecode/int/array.cc +0 -61
  731. data/ext/gecode-1.3.1/gecode/int/array.icc +0 -264
  732. data/ext/gecode-1.3.1/gecode/int/bool.cc +0 -187
  733. data/ext/gecode-1.3.1/gecode/int/bool.hh +0 -255
  734. data/ext/gecode-1.3.1/gecode/int/bool/base.icc +0 -123
  735. data/ext/gecode-1.3.1/gecode/int/bool/eq.icc +0 -89
  736. data/ext/gecode-1.3.1/gecode/int/bool/eqv.icc +0 -132
  737. data/ext/gecode-1.3.1/gecode/int/bool/or.icc +0 -380
  738. data/ext/gecode-1.3.1/gecode/int/branch.cc +0 -81
  739. data/ext/gecode-1.3.1/gecode/int/branch.hh +0 -444
  740. data/ext/gecode-1.3.1/gecode/int/branch/assign.cc +0 -83
  741. data/ext/gecode-1.3.1/gecode/int/branch/assign.icc +0 -76
  742. data/ext/gecode-1.3.1/gecode/int/branch/select-val.icc +0 -104
  743. data/ext/gecode-1.3.1/gecode/int/branch/select-view.icc +0 -219
  744. data/ext/gecode-1.3.1/gecode/int/channel.cc +0 -62
  745. data/ext/gecode-1.3.1/gecode/int/channel.hh +0 -144
  746. data/ext/gecode-1.3.1/gecode/int/channel/base.icc +0 -60
  747. data/ext/gecode-1.3.1/gecode/int/channel/dom.icc +0 -313
  748. data/ext/gecode-1.3.1/gecode/int/channel/stack.icc +0 -59
  749. data/ext/gecode-1.3.1/gecode/int/channel/val.icc +0 -239
  750. data/ext/gecode-1.3.1/gecode/int/count.cc +0 -174
  751. data/ext/gecode-1.3.1/gecode/int/count.hh +0 -401
  752. data/ext/gecode-1.3.1/gecode/int/count/int.icc +0 -495
  753. data/ext/gecode-1.3.1/gecode/int/count/rel.icc +0 -100
  754. data/ext/gecode-1.3.1/gecode/int/count/view.icc +0 -332
  755. data/ext/gecode-1.3.1/gecode/int/cumulatives.cc +0 -210
  756. data/ext/gecode-1.3.1/gecode/int/cumulatives.hh +0 -118
  757. data/ext/gecode-1.3.1/gecode/int/cumulatives/val.icc +0 -377
  758. data/ext/gecode-1.3.1/gecode/int/distinct.cc +0 -77
  759. data/ext/gecode-1.3.1/gecode/int/distinct.hh +0 -272
  760. data/ext/gecode-1.3.1/gecode/int/distinct/bilink.icc +0 -73
  761. data/ext/gecode-1.3.1/gecode/int/distinct/bnd.icc +0 -335
  762. data/ext/gecode-1.3.1/gecode/int/distinct/combptr.icc +0 -62
  763. data/ext/gecode-1.3.1/gecode/int/distinct/dom.icc +0 -740
  764. data/ext/gecode-1.3.1/gecode/int/distinct/edge.icc +0 -96
  765. data/ext/gecode-1.3.1/gecode/int/distinct/node.icc +0 -107
  766. data/ext/gecode-1.3.1/gecode/int/distinct/ter-dom.icc +0 -97
  767. data/ext/gecode-1.3.1/gecode/int/distinct/val.icc +0 -171
  768. data/ext/gecode-1.3.1/gecode/int/dom.cc +0 -81
  769. data/ext/gecode-1.3.1/gecode/int/dom.hh +0 -101
  770. data/ext/gecode-1.3.1/gecode/int/dom/range.icc +0 -85
  771. data/ext/gecode-1.3.1/gecode/int/dom/spec.icc +0 -85
  772. data/ext/gecode-1.3.1/gecode/int/element.cc +0 -58
  773. data/ext/gecode-1.3.1/gecode/int/element.hh +0 -203
  774. data/ext/gecode-1.3.1/gecode/int/element/int.icc +0 -396
  775. data/ext/gecode-1.3.1/gecode/int/element/view.icc +0 -443
  776. data/ext/gecode-1.3.1/gecode/int/exception.icc +0 -137
  777. data/ext/gecode-1.3.1/gecode/int/gcc.cc +0 -708
  778. data/ext/gecode-1.3.1/gecode/int/gcc.hh +0 -338
  779. data/ext/gecode-1.3.1/gecode/int/gcc/bnd.icc +0 -629
  780. data/ext/gecode-1.3.1/gecode/int/gcc/dom.icc +0 -504
  781. data/ext/gecode-1.3.1/gecode/int/gcc/gccbndsup.icc +0 -760
  782. data/ext/gecode-1.3.1/gecode/int/gcc/graphsup.icc +0 -2375
  783. data/ext/gecode-1.3.1/gecode/int/gcc/lbc.icc +0 -375
  784. data/ext/gecode-1.3.1/gecode/int/gcc/occur.icc +0 -687
  785. data/ext/gecode-1.3.1/gecode/int/gcc/ubc.icc +0 -236
  786. data/ext/gecode-1.3.1/gecode/int/gcc/val.icc +0 -373
  787. data/ext/gecode-1.3.1/gecode/int/int-set.cc +0 -115
  788. data/ext/gecode-1.3.1/gecode/int/int-set.icc +0 -151
  789. data/ext/gecode-1.3.1/gecode/int/linear.cc +0 -247
  790. data/ext/gecode-1.3.1/gecode/int/linear.hh +0 -1056
  791. data/ext/gecode-1.3.1/gecode/int/linear/binary.icc +0 -439
  792. data/ext/gecode-1.3.1/gecode/int/linear/bool-int.icc +0 -422
  793. data/ext/gecode-1.3.1/gecode/int/linear/bool-view.icc +0 -311
  794. data/ext/gecode-1.3.1/gecode/int/linear/dom.icc +0 -503
  795. data/ext/gecode-1.3.1/gecode/int/linear/nary.icc +0 -857
  796. data/ext/gecode-1.3.1/gecode/int/linear/noview.icc +0 -264
  797. data/ext/gecode-1.3.1/gecode/int/linear/post.cc +0 -542
  798. data/ext/gecode-1.3.1/gecode/int/linear/ternary.icc +0 -255
  799. data/ext/gecode-1.3.1/gecode/int/propagator.icc +0 -194
  800. data/ext/gecode-1.3.1/gecode/int/regular.cc +0 -40
  801. data/ext/gecode-1.3.1/gecode/int/regular.hh +0 -83
  802. data/ext/gecode-1.3.1/gecode/int/regular/dfa.cc +0 -466
  803. data/ext/gecode-1.3.1/gecode/int/regular/dfa.icc +0 -172
  804. data/ext/gecode-1.3.1/gecode/int/regular/dom.icc +0 -480
  805. data/ext/gecode-1.3.1/gecode/int/regular/reg.cc +0 -738
  806. data/ext/gecode-1.3.1/gecode/int/rel.cc +0 -293
  807. data/ext/gecode-1.3.1/gecode/int/rel.hh +0 -526
  808. data/ext/gecode-1.3.1/gecode/int/rel/eq.icc +0 -640
  809. data/ext/gecode-1.3.1/gecode/int/rel/lex.icc +0 -212
  810. data/ext/gecode-1.3.1/gecode/int/rel/lq-le.icc +0 -246
  811. data/ext/gecode-1.3.1/gecode/int/rel/nq.icc +0 -188
  812. data/ext/gecode-1.3.1/gecode/int/sortedness.cc +0 -124
  813. data/ext/gecode-1.3.1/gecode/int/sortedness.hh +0 -108
  814. data/ext/gecode-1.3.1/gecode/int/sortedness/matching.icc +0 -177
  815. data/ext/gecode-1.3.1/gecode/int/sortedness/narrowing.icc +0 -243
  816. data/ext/gecode-1.3.1/gecode/int/sortedness/order.icc +0 -232
  817. data/ext/gecode-1.3.1/gecode/int/sortedness/sortedness.icc +0 -727
  818. data/ext/gecode-1.3.1/gecode/int/sortedness/sortsup.icc +0 -666
  819. data/ext/gecode-1.3.1/gecode/int/var-imp.vis +0 -198
  820. data/ext/gecode-1.3.1/gecode/int/var.icc +0 -590
  821. data/ext/gecode-1.3.1/gecode/int/var/bool.icc +0 -52
  822. data/ext/gecode-1.3.1/gecode/int/var/imp-body.icc +0 -65
  823. data/ext/gecode-1.3.1/gecode/int/var/imp-hdr.icc +0 -191
  824. data/ext/gecode-1.3.1/gecode/int/var/imp.cc +0 -361
  825. data/ext/gecode-1.3.1/gecode/int/var/imp.icc +0 -579
  826. data/ext/gecode-1.3.1/gecode/int/var/int.cc +0 -63
  827. data/ext/gecode-1.3.1/gecode/int/var/int.icc +0 -135
  828. data/ext/gecode-1.3.1/gecode/int/view.icc +0 -1219
  829. data/ext/gecode-1.3.1/gecode/int/view/bool.icc +0 -270
  830. data/ext/gecode-1.3.1/gecode/int/view/constint.icc +0 -306
  831. data/ext/gecode-1.3.1/gecode/int/view/int.icc +0 -221
  832. data/ext/gecode-1.3.1/gecode/int/view/iter.icc +0 -49
  833. data/ext/gecode-1.3.1/gecode/int/view/minus.icc +0 -285
  834. data/ext/gecode-1.3.1/gecode/int/view/offset.icc +0 -274
  835. data/ext/gecode-1.3.1/gecode/int/view/print.cc +0 -109
  836. data/ext/gecode-1.3.1/gecode/int/view/rtest.icc +0 -215
  837. data/ext/gecode-1.3.1/gecode/int/view/scale.icc +0 -373
  838. data/ext/gecode-1.3.1/gecode/iter.hh +0 -65
  839. data/ext/gecode-1.3.1/gecode/iter/ranges-add.icc +0 -130
  840. data/ext/gecode-1.3.1/gecode/iter/ranges-append.icc +0 -208
  841. data/ext/gecode-1.3.1/gecode/iter/ranges-array.icc +0 -123
  842. data/ext/gecode-1.3.1/gecode/iter/ranges-cache.icc +0 -143
  843. data/ext/gecode-1.3.1/gecode/iter/ranges-compl.icc +0 -206
  844. data/ext/gecode-1.3.1/gecode/iter/ranges-diff.icc +0 -127
  845. data/ext/gecode-1.3.1/gecode/iter/ranges-empty.icc +0 -96
  846. data/ext/gecode-1.3.1/gecode/iter/ranges-inter.icc +0 -202
  847. data/ext/gecode-1.3.1/gecode/iter/ranges-minmax.icc +0 -103
  848. data/ext/gecode-1.3.1/gecode/iter/ranges-minus.icc +0 -138
  849. data/ext/gecode-1.3.1/gecode/iter/ranges-offset.icc +0 -112
  850. data/ext/gecode-1.3.1/gecode/iter/ranges-operations.icc +0 -142
  851. data/ext/gecode-1.3.1/gecode/iter/ranges-scale.icc +0 -224
  852. data/ext/gecode-1.3.1/gecode/iter/ranges-singleton.icc +0 -71
  853. data/ext/gecode-1.3.1/gecode/iter/ranges-size.icc +0 -131
  854. data/ext/gecode-1.3.1/gecode/iter/ranges-union.icc +0 -211
  855. data/ext/gecode-1.3.1/gecode/iter/ranges-values.icc +0 -125
  856. data/ext/gecode-1.3.1/gecode/iter/values-ranges.icc +0 -91
  857. data/ext/gecode-1.3.1/gecode/iter/virtual-ranges-compl.icc +0 -247
  858. data/ext/gecode-1.3.1/gecode/iter/virtual-ranges-inter.icc +0 -227
  859. data/ext/gecode-1.3.1/gecode/iter/virtual-ranges-union.icc +0 -236
  860. data/ext/gecode-1.3.1/gecode/iter/virtual-ranges.icc +0 -126
  861. data/ext/gecode-1.3.1/gecode/kernel.hh +0 -141
  862. data/ext/gecode-1.3.1/gecode/kernel/array.icc +0 -954
  863. data/ext/gecode-1.3.1/gecode/kernel/branching.icc +0 -233
  864. data/ext/gecode-1.3.1/gecode/kernel/core.cc +0 -417
  865. data/ext/gecode-1.3.1/gecode/kernel/core.icc +0 -1681
  866. data/ext/gecode-1.3.1/gecode/kernel/exception.cc +0 -49
  867. data/ext/gecode-1.3.1/gecode/kernel/exception.icc +0 -104
  868. data/ext/gecode-1.3.1/gecode/kernel/macros.icc +0 -98
  869. data/ext/gecode-1.3.1/gecode/kernel/memory-manager.cc +0 -41
  870. data/ext/gecode-1.3.1/gecode/kernel/memory-manager.icc +0 -438
  871. data/ext/gecode-1.3.1/gecode/kernel/memory.icc +0 -205
  872. data/ext/gecode-1.3.1/gecode/kernel/modevent.icc +0 -53
  873. data/ext/gecode-1.3.1/gecode/kernel/propagator.icc +0 -680
  874. data/ext/gecode-1.3.1/gecode/kernel/view.icc +0 -583
  875. data/ext/gecode-1.3.1/gecode/limits.hh +0 -87
  876. data/ext/gecode-1.3.1/gecode/minimodel.hh +0 -942
  877. data/ext/gecode-1.3.1/gecode/minimodel/arithmetic.cc +0 -137
  878. data/ext/gecode-1.3.1/gecode/minimodel/bool-expr.cc +0 -207
  879. data/ext/gecode-1.3.1/gecode/minimodel/bool-expr.icc +0 -191
  880. data/ext/gecode-1.3.1/gecode/minimodel/bool-rel.icc +0 -66
  881. data/ext/gecode-1.3.1/gecode/minimodel/exception.icc +0 -59
  882. data/ext/gecode-1.3.1/gecode/minimodel/lin-expr.cc +0 -103
  883. data/ext/gecode-1.3.1/gecode/minimodel/lin-expr.icc +0 -192
  884. data/ext/gecode-1.3.1/gecode/minimodel/lin-rel.icc +0 -200
  885. data/ext/gecode-1.3.1/gecode/minimodel/matrix.icc +0 -118
  886. data/ext/gecode-1.3.1/gecode/minimodel/scheduling.cc +0 -241
  887. data/ext/gecode-1.3.1/gecode/search.hh +0 -745
  888. data/ext/gecode-1.3.1/gecode/search/bab.cc +0 -153
  889. data/ext/gecode-1.3.1/gecode/search/bab.icc +0 -101
  890. data/ext/gecode-1.3.1/gecode/search/dfs.cc +0 -63
  891. data/ext/gecode-1.3.1/gecode/search/dfs.icc +0 -144
  892. data/ext/gecode-1.3.1/gecode/search/engine-ctrl.icc +0 -109
  893. data/ext/gecode-1.3.1/gecode/search/lds.cc +0 -237
  894. data/ext/gecode-1.3.1/gecode/search/lds.icc +0 -57
  895. data/ext/gecode-1.3.1/gecode/search/reco-stack.icc +0 -219
  896. data/ext/gecode-1.3.1/gecode/search/restart.icc +0 -76
  897. data/ext/gecode-1.3.1/gecode/search/statistics.icc +0 -30
  898. data/ext/gecode-1.3.1/gecode/search/stop.cc +0 -58
  899. data/ext/gecode-1.3.1/gecode/search/stop.icc +0 -100
  900. data/ext/gecode-1.3.1/gecode/set.hh +0 -419
  901. data/ext/gecode-1.3.1/gecode/set/array.cc +0 -114
  902. data/ext/gecode-1.3.1/gecode/set/array.icc +0 -134
  903. data/ext/gecode-1.3.1/gecode/set/branch.cc +0 -57
  904. data/ext/gecode-1.3.1/gecode/set/branch.hh +0 -176
  905. data/ext/gecode-1.3.1/gecode/set/branch/select-val.icc +0 -72
  906. data/ext/gecode-1.3.1/gecode/set/branch/select-view.icc +0 -112
  907. data/ext/gecode-1.3.1/gecode/set/cardinality.cc +0 -49
  908. data/ext/gecode-1.3.1/gecode/set/convex.cc +0 -43
  909. data/ext/gecode-1.3.1/gecode/set/convex.hh +0 -92
  910. data/ext/gecode-1.3.1/gecode/set/convex/conv.cc +0 -81
  911. data/ext/gecode-1.3.1/gecode/set/convex/conv.icc +0 -51
  912. data/ext/gecode-1.3.1/gecode/set/convex/hull.cc +0 -100
  913. data/ext/gecode-1.3.1/gecode/set/convex/hull.icc +0 -52
  914. data/ext/gecode-1.3.1/gecode/set/distinct.cc +0 -48
  915. data/ext/gecode-1.3.1/gecode/set/distinct.hh +0 -97
  916. data/ext/gecode-1.3.1/gecode/set/distinct/atmostOne.cc +0 -151
  917. data/ext/gecode-1.3.1/gecode/set/distinct/atmostOne.icc +0 -50
  918. data/ext/gecode-1.3.1/gecode/set/distinct/binomial.cc +0 -46
  919. data/ext/gecode-1.3.1/gecode/set/distinct/binomial.icc +0 -157
  920. data/ext/gecode-1.3.1/gecode/set/distinct/distinct.cc +0 -124
  921. data/ext/gecode-1.3.1/gecode/set/distinct/distinct.icc +0 -58
  922. data/ext/gecode-1.3.1/gecode/set/dom.cc +0 -224
  923. data/ext/gecode-1.3.1/gecode/set/exception.icc +0 -132
  924. data/ext/gecode-1.3.1/gecode/set/int.cc +0 -139
  925. data/ext/gecode-1.3.1/gecode/set/int.hh +0 -226
  926. data/ext/gecode-1.3.1/gecode/set/int/card.cc +0 -61
  927. data/ext/gecode-1.3.1/gecode/set/int/card.icc +0 -54
  928. data/ext/gecode-1.3.1/gecode/set/int/channel.cc +0 -100
  929. data/ext/gecode-1.3.1/gecode/set/int/channel.icc +0 -75
  930. data/ext/gecode-1.3.1/gecode/set/int/match.cc +0 -148
  931. data/ext/gecode-1.3.1/gecode/set/int/match.icc +0 -67
  932. data/ext/gecode-1.3.1/gecode/set/int/minmax.cc +0 -109
  933. data/ext/gecode-1.3.1/gecode/set/int/minmax.icc +0 -63
  934. data/ext/gecode-1.3.1/gecode/set/int/weights.cc +0 -182
  935. data/ext/gecode-1.3.1/gecode/set/int/weights.icc +0 -174
  936. data/ext/gecode-1.3.1/gecode/set/projectors-compiler.hh +0 -148
  937. data/ext/gecode-1.3.1/gecode/set/projectors.cc +0 -109
  938. data/ext/gecode-1.3.1/gecode/set/projectors.hh +0 -319
  939. data/ext/gecode-1.3.1/gecode/set/projectors/compiler.cc +0 -841
  940. data/ext/gecode-1.3.1/gecode/set/projectors/projector-set.cc +0 -69
  941. data/ext/gecode-1.3.1/gecode/set/projectors/projector-set.icc +0 -66
  942. data/ext/gecode-1.3.1/gecode/set/projectors/projector.cc +0 -125
  943. data/ext/gecode-1.3.1/gecode/set/projectors/projector.icc +0 -79
  944. data/ext/gecode-1.3.1/gecode/set/projectors/propagator.hh +0 -127
  945. data/ext/gecode-1.3.1/gecode/set/projectors/propagator/card.icc +0 -96
  946. data/ext/gecode-1.3.1/gecode/set/projectors/propagator/nary.icc +0 -106
  947. data/ext/gecode-1.3.1/gecode/set/projectors/propagator/re-nary.cc +0 -76
  948. data/ext/gecode-1.3.1/gecode/set/projectors/propagator/re-nary.icc +0 -53
  949. data/ext/gecode-1.3.1/gecode/set/projectors/set-expr.cc +0 -306
  950. data/ext/gecode-1.3.1/gecode/set/projectors/set-expr.icc +0 -192
  951. data/ext/gecode-1.3.1/gecode/set/propagator.icc +0 -96
  952. data/ext/gecode-1.3.1/gecode/set/rel-op-const.cc +0 -233
  953. data/ext/gecode-1.3.1/gecode/set/rel-op.cc +0 -96
  954. data/ext/gecode-1.3.1/gecode/set/rel-op.hh +0 -267
  955. data/ext/gecode-1.3.1/gecode/set/rel-op/common.icc +0 -528
  956. data/ext/gecode-1.3.1/gecode/set/rel-op/inter.icc +0 -312
  957. data/ext/gecode-1.3.1/gecode/set/rel-op/partition.icc +0 -131
  958. data/ext/gecode-1.3.1/gecode/set/rel-op/post.icc +0 -198
  959. data/ext/gecode-1.3.1/gecode/set/rel-op/subofunion.icc +0 -150
  960. data/ext/gecode-1.3.1/gecode/set/rel-op/superofinter.icc +0 -151
  961. data/ext/gecode-1.3.1/gecode/set/rel-op/union.icc +0 -292
  962. data/ext/gecode-1.3.1/gecode/set/rel.cc +0 -201
  963. data/ext/gecode-1.3.1/gecode/set/rel.hh +0 -250
  964. data/ext/gecode-1.3.1/gecode/set/rel/common.icc +0 -109
  965. data/ext/gecode-1.3.1/gecode/set/rel/eq.icc +0 -101
  966. data/ext/gecode-1.3.1/gecode/set/rel/nosubset.icc +0 -88
  967. data/ext/gecode-1.3.1/gecode/set/rel/nq.icc +0 -132
  968. data/ext/gecode-1.3.1/gecode/set/rel/re-eq.icc +0 -142
  969. data/ext/gecode-1.3.1/gecode/set/rel/re-subset.icc +0 -121
  970. data/ext/gecode-1.3.1/gecode/set/rel/subset.icc +0 -80
  971. data/ext/gecode-1.3.1/gecode/set/select.cc +0 -88
  972. data/ext/gecode-1.3.1/gecode/set/select.hh +0 -113
  973. data/ext/gecode-1.3.1/gecode/set/select/disjoint.cc +0 -267
  974. data/ext/gecode-1.3.1/gecode/set/select/disjoint.icc +0 -59
  975. data/ext/gecode-1.3.1/gecode/set/select/idxarray.hh +0 -91
  976. data/ext/gecode-1.3.1/gecode/set/select/idxarray.icc +0 -112
  977. data/ext/gecode-1.3.1/gecode/set/select/inter.icc +0 -300
  978. data/ext/gecode-1.3.1/gecode/set/sequence.cc +0 -48
  979. data/ext/gecode-1.3.1/gecode/set/sequence.hh +0 -97
  980. data/ext/gecode-1.3.1/gecode/set/sequence/common.icc +0 -79
  981. data/ext/gecode-1.3.1/gecode/set/sequence/seq-u.cc +0 -83
  982. data/ext/gecode-1.3.1/gecode/set/sequence/seq-u.icc +0 -63
  983. data/ext/gecode-1.3.1/gecode/set/sequence/seq.cc +0 -61
  984. data/ext/gecode-1.3.1/gecode/set/sequence/seq.icc +0 -53
  985. data/ext/gecode-1.3.1/gecode/set/var-imp.vis +0 -205
  986. data/ext/gecode-1.3.1/gecode/set/var.icc +0 -1090
  987. data/ext/gecode-1.3.1/gecode/set/var/imp-body.icc +0 -192
  988. data/ext/gecode-1.3.1/gecode/set/var/imp-hdr.icc +0 -235
  989. data/ext/gecode-1.3.1/gecode/set/var/imp.cc +0 -127
  990. data/ext/gecode-1.3.1/gecode/set/var/imp.icc +0 -356
  991. data/ext/gecode-1.3.1/gecode/set/var/integerset.cc +0 -256
  992. data/ext/gecode-1.3.1/gecode/set/var/integerset.icc +0 -512
  993. data/ext/gecode-1.3.1/gecode/set/var/iter.icc +0 -47
  994. data/ext/gecode-1.3.1/gecode/set/var/set.cc +0 -99
  995. data/ext/gecode-1.3.1/gecode/set/var/set.icc +0 -282
  996. data/ext/gecode-1.3.1/gecode/set/view.icc +0 -1075
  997. data/ext/gecode-1.3.1/gecode/set/view/complement.icc +0 -525
  998. data/ext/gecode-1.3.1/gecode/set/view/const.icc +0 -651
  999. data/ext/gecode-1.3.1/gecode/set/view/print.cc +0 -120
  1000. data/ext/gecode-1.3.1/gecode/set/view/set.icc +0 -217
  1001. data/ext/gecode-1.3.1/gecode/set/view/singleton.icc +0 -348
  1002. data/ext/gecode-1.3.1/gecode/support/block-allocator.hh +0 -152
  1003. data/ext/gecode-1.3.1/gecode/support/dynamic-array.hh +0 -131
  1004. data/ext/gecode-1.3.1/gecode/support/dynamic-stack.hh +0 -157
  1005. data/ext/gecode-1.3.1/gecode/support/random.hh +0 -100
  1006. data/ext/gecode-1.3.1/gecode/support/shared-array.hh +0 -255
  1007. data/ext/gecode-1.3.1/gecode/support/sort.hh +0 -193
  1008. data/ext/gecode-1.3.1/gecode/support/static-pqueue.hh +0 -240
  1009. data/ext/gecode-1.3.1/gecode/support/static-stack.hh +0 -117
  1010. data/ext/gecode-1.3.1/misc/debian/Makefile.am +0 -8
  1011. data/ext/gecode-1.3.1/misc/debian/copyright +0 -44
  1012. data/ext/gecode-1.3.1/misc/doxygen/stylesheet.css +0 -460
  1013. data/ext/gecode-1.3.1/misc/fixproperties.sh +0 -32
  1014. data/ext/gecode-1.3.1/misc/gecode-minimodel.pc.in +0 -12
  1015. data/ext/gecode-1.3.1/misc/gecode-search.pc.in +0 -12
  1016. data/ext/gecode-1.3.1/misc/gecode.pc.in +0 -12
  1017. data/ext/gecode-1.3.1/misc/genchangelog.perl +0 -190
  1018. data/ext/gecode-1.3.1/misc/genlicense.perl +0 -113
  1019. data/ext/gecode-1.3.1/misc/genstatistics.perl +0 -155
  1020. data/ext/gecode-1.3.1/misc/gentxtchangelog.perl +0 -170
  1021. data/ext/gecode-1.3.1/misc/genvarimp.perl +0 -666
  1022. data/ext/gecode-1.3.1/misc/getrevision.perl +0 -32
  1023. data/ext/gecode-1.3.1/misc/makedepend.perl +0 -66
  1024. data/ext/gecode-1.3.1/test/int.cc +0 -497
  1025. data/ext/gecode-1.3.1/test/int.hh +0 -119
  1026. data/ext/gecode-1.3.1/test/int/arithmetic.cc +0 -262
  1027. data/ext/gecode-1.3.1/test/int/basic.cc +0 -42
  1028. data/ext/gecode-1.3.1/test/int/bool.cc +0 -189
  1029. data/ext/gecode-1.3.1/test/int/channel.cc +0 -79
  1030. data/ext/gecode-1.3.1/test/int/count.cc +0 -264
  1031. data/ext/gecode-1.3.1/test/int/distinct.cc +0 -121
  1032. data/ext/gecode-1.3.1/test/int/dom.cc +0 -69
  1033. data/ext/gecode-1.3.1/test/int/element.cc +0 -132
  1034. data/ext/gecode-1.3.1/test/int/gcc.cc +0 -592
  1035. data/ext/gecode-1.3.1/test/int/linear.cc +0 -315
  1036. data/ext/gecode-1.3.1/test/int/minimodel.cc +0 -451
  1037. data/ext/gecode-1.3.1/test/int/regular.cc +0 -105
  1038. data/ext/gecode-1.3.1/test/int/rel.cc +0 -283
  1039. data/ext/gecode-1.3.1/test/int/scheduling.cc +0 -259
  1040. data/ext/gecode-1.3.1/test/int/sortedness.cc +0 -272
  1041. data/ext/gecode-1.3.1/test/intset.cc +0 -40
  1042. data/ext/gecode-1.3.1/test/log.cc +0 -515
  1043. data/ext/gecode-1.3.1/test/log.hh +0 -68
  1044. data/ext/gecode-1.3.1/test/set.cc +0 -542
  1045. data/ext/gecode-1.3.1/test/set.hh +0 -152
  1046. data/ext/gecode-1.3.1/test/set/convex.cc +0 -94
  1047. data/ext/gecode-1.3.1/test/set/distinct.cc +0 -148
  1048. data/ext/gecode-1.3.1/test/set/dom.cc +0 -67
  1049. data/ext/gecode-1.3.1/test/set/int.cc +0 -249
  1050. data/ext/gecode-1.3.1/test/set/projection.cc +0 -333
  1051. data/ext/gecode-1.3.1/test/set/rel-op.cc +0 -662
  1052. data/ext/gecode-1.3.1/test/set/rel.cc +0 -198
  1053. data/ext/gecode-1.3.1/test/set/select.cc +0 -108
  1054. data/ext/gecode-1.3.1/test/set/sequence.cc +0 -83
  1055. data/ext/gecode-1.3.1/test/stress.cc +0 -93
  1056. data/ext/gecode-1.3.1/test/stress.hh +0 -74
  1057. data/ext/gecode-1.3.1/test/stress/distinct.cc +0 -70
  1058. data/ext/gecode-1.3.1/test/stress/domain.cc +0 -69
  1059. data/ext/gecode-1.3.1/test/stress/exec.cc +0 -60
  1060. data/ext/gecode-1.3.1/test/stress/minsort.cc +0 -63
  1061. data/ext/gecode-1.3.1/test/stress/regular.cc +0 -112
  1062. data/ext/gecode-1.3.1/test/test.cc +0 -215
  1063. data/ext/gecode-1.3.1/test/test.hh +0 -107
@@ -0,0 +1,2422 @@
1
+ /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Main authors:
4
+ * Patrick Pekczynski <pekczynski@ps.uni-sb.de>
5
+ *
6
+ * Copyright:
7
+ * Patrick Pekczynski, 2005
8
+ *
9
+ * Last modified:
10
+ * $Date: 2008-02-27 11:24:12 +0100 (Wed, 27 Feb 2008) $ by $Author: tack $
11
+ * $Revision: 6323 $
12
+ *
13
+ * This file is part of Gecode, the generic constraint
14
+ * development environment:
15
+ * http://www.gecode.org
16
+ *
17
+ * Permission is hereby granted, free of charge, to any person obtaining
18
+ * a copy of this software and associated documentation files (the
19
+ * "Software"), to deal in the Software without restriction, including
20
+ * without limitation the rights to use, copy, modify, merge, publish,
21
+ * distribute, sublicense, and/or sell copies of the Software, and to
22
+ * permit persons to whom the Software is furnished to do so, subject to
23
+ * the following conditions:
24
+ *
25
+ * The above copyright notice and this permission notice shall be
26
+ * included in all copies or substantial portions of the Software.
27
+ *
28
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
29
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
30
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
31
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
32
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
33
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
34
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35
+ *
36
+ */
37
+
38
+ namespace Gecode { namespace Int { namespace GCC {
39
+
40
+ /**
41
+ * \brief Bounds constraint (BC) type
42
+ *
43
+ * If BC = UBC, then we argue about the Upper Bounds Constraint
44
+ * else we use the functions for the Lower Bounds Constraint
45
+ */
46
+ enum BC {UBC = 1, LBC = 0};
47
+
48
+ class Edge;
49
+ /// Base class for nodes in the variable-value-graph
50
+ class VVGNode {
51
+ private:
52
+ /// stores all incident edges on the node
53
+ Edge* e;
54
+ /// returns the first edge
55
+ Edge* fst;
56
+ /// returns the last edge
57
+ Edge* lst;
58
+ /// single incoming edge used for storing a path in the algorithms
59
+ Edge* ie;
60
+ /// Mark as matching edge in LBC
61
+ bool lm;
62
+ /// Mark as matching edge in UBC
63
+ bool um;
64
+ /// Explicit node type
65
+ bool type;
66
+ public:
67
+ /// \name Constructors and initialization
68
+ //@{
69
+ /// Default constructor
70
+ VVGNode(void);
71
+ //@}
72
+ /// Destructor
73
+ virtual ~VVGNode(void){};
74
+ /// Create a new node
75
+ void* operator new(size_t, void*);
76
+
77
+ /// \name Access
78
+ //@{
79
+ /// return reference to the incident edges
80
+ Edge** adj(void);
81
+ /// return pointer to the first incident edge
82
+ Edge* first(void);
83
+ /// return pointer to the last incident edge
84
+ Edge* last(void);
85
+ /// return pointer to the node's inedge
86
+ Edge* inedge(void);
87
+ /// return the type of the node
88
+ bool get_type(void);
89
+ /// access the matching flag of the node
90
+ template <BC>
91
+ bool get_match_flag(void);
92
+ /// get the information on the node (either var-index or value)
93
+ virtual int get_info(void) = 0;
94
+ /// test whether the node is matched
95
+ virtual bool is_matched(BC) = 0;
96
+
97
+ /// check whether a node has been removed from the graph
98
+ virtual bool removed(void) = 0;
99
+ //@}
100
+
101
+ /// \name Update
102
+ //@{
103
+ /// set the first edge pointer to \a p
104
+ void first(Edge* p);
105
+ /// set the last edge pointer to \a p
106
+ void last(Edge* p);
107
+ /// set the inedge pointer to \a p
108
+ void inedge(Edge* p);
109
+ /// set the node type to \a t
110
+ void set_type(bool t);
111
+ /// set the matching flag to \a f
112
+ template <BC>
113
+ void set_match_flag(bool f);
114
+ /// set the node information to \a i
115
+ virtual void set_info(int i) = 0;
116
+ //@}
117
+ };
118
+
119
+ /// %Variable Node
120
+ class VarNode : public VVGNode {
121
+ private:
122
+ /// stores the matching edge on this node in the UBC
123
+ Edge* ubm;
124
+ /// stores the matching edge on this node in the LBC
125
+ Edge* lbm;
126
+
127
+ public:
128
+ /// stores the variable index of the node
129
+ unsigned int var;
130
+ /// stores the number of incident edges on the node
131
+ unsigned int noe;
132
+
133
+ /// stores the variable index of the node
134
+ unsigned int xindex;
135
+
136
+ /// \name Constructors and initialization
137
+ //@{
138
+ /// Creates a variable node with index i
139
+ VarNode(int i, int oidx);
140
+ //@}
141
+
142
+ /// \name Access
143
+ //@{
144
+ /// return the matching edge on the node
145
+ template <BC>
146
+ Edge* get_match(void);
147
+ /// return the variable index of the node
148
+ int get_info(void);
149
+ /// returns whether the node is still matchable
150
+ bool is_matched(BC);
151
+ /// tests whether the node is matched or not
152
+ template <BC>
153
+ bool matched(void);
154
+
155
+ /// check for removal from graph
156
+ bool removed(void);
157
+ //@}
158
+
159
+ /// \name Update
160
+ //@{
161
+ /// set the node info to \a i
162
+ void set_info(int i);
163
+ /// set the pointer of the matching edge to m
164
+ template <BC>
165
+ void set_match(Edge* m);
166
+ /// match the node
167
+ template <BC>
168
+ void match(void);
169
+ /// unmatch the node
170
+ template <BC>
171
+ void unmatch(void);
172
+ //@}
173
+ };
174
+
175
+ /// Value node
176
+ class ValNode : public VVGNode {
177
+ private:
178
+ /// minimal required occurence of the value as stored in k
179
+ int _klb;
180
+ /// maximal required occurence of the value as stored in k
181
+ int _kub;
182
+ /// index to acces the value via cardinality array k
183
+ int _kidx;
184
+ /// stores the current number of occurences of the value
185
+ int _kcount;
186
+
187
+
188
+ /// store numbre of conflicting matching edges
189
+ int noc;
190
+
191
+ /**
192
+ * \brief Minimal capacity of the value node
193
+ *
194
+ * Stores who often the value node can be matched in a LBC-matching
195
+ */
196
+ int lb;
197
+ int ublow;
198
+ /**
199
+ * \brief Maximal capacity of the value node
200
+ *
201
+ * Stores who often the value node can be matched in a UBC-matching
202
+ */
203
+
204
+ int ub;
205
+
206
+ public:
207
+ /// stores the value of the node
208
+ int val;
209
+ /// stores the index of the node
210
+ int idx;
211
+ /// stores the number of incident edges on the node
212
+ int noe;
213
+
214
+ /// \name Constructors and destructors
215
+ //@{
216
+ /**
217
+ * \brief Constructor for value node
218
+ *
219
+ * with minimal capacity \a min,
220
+ * maximal capacity \a max,
221
+ * the value \a value and the index \a k_access in \a k
222
+ */
223
+ ValNode(int min, int max, int value, int kidx, int kshift, int count);
224
+ //@}
225
+
226
+ /// \name Access
227
+ //@{
228
+
229
+ /// set the max cap for LBC
230
+ void set_maxlow(int i);
231
+ /// get max cap for LBC
232
+ int get_maxlow(void);
233
+
234
+
235
+ /// Mark the value node as conflicting in case of variable cardinalities
236
+ void card_conflict(int c);
237
+ /// Check whether the value node is conflicting
238
+ int card_conflict(void);
239
+ /// Reduce the conflict counter
240
+ void red_conflict(void);
241
+
242
+ /// check for removal from graph
243
+ bool removed(void);
244
+
245
+ /// increases the value counter
246
+ void inc(void);
247
+ /// returns the current number of occurences of the value
248
+ int kcount(void);
249
+ /// returns the number of incident matching edges on a value node
250
+ template <BC>
251
+ int incid_match(void);
252
+ /// returns the index in cardinality array k
253
+ int kindex(void);
254
+ /// return the node information
255
+ int get_info(void);
256
+ /// returns \a true if the node is matched in BC, \a false otherwise
257
+ template <BC>
258
+ bool matched(void);
259
+ /// tests whether the node is a sink
260
+ bool sink(void);
261
+ /// tests whether the node is a source
262
+ bool source(void);
263
+ /// return the minimal node capacity as stored in \a k
264
+ int kmin(void);
265
+ /// return the maximal node capacity as stored in \a k
266
+ int kmax(void);
267
+ /// return minimal or maximal capacity
268
+ template <BC>
269
+ int kbound(void);
270
+
271
+ /// returns whether the node is still matchable
272
+ bool is_matched(BC);
273
+ //@}
274
+
275
+ /// \name Update
276
+ //@{
277
+ void kcount(int);
278
+ /// changes the index in the cardinality array k
279
+ void kindex(int);
280
+ /// decrease the node-capacity
281
+ template <BC>
282
+ void dec(void);
283
+ /// increase the node-capacity
284
+ template <BC>
285
+ void inc(void);
286
+ /// return the the node-capacity
287
+ template <BC>
288
+ int cap(void);
289
+ /// set the node-capacity to \a c
290
+ template <BC>
291
+ void set_cap(int c);
292
+ /// match the node
293
+ template <BC>
294
+ void match(void);
295
+ /// unmatch the node
296
+ template <BC>
297
+ void unmatch(void);
298
+ /// node reset to original capacity values
299
+ void reset(void);
300
+ /// set the node infomration to \a i
301
+ void set_info(int i);
302
+ /// set the minimal k-capacity to min
303
+ void set_kmin(int min);
304
+ /// set the maximal k-capacity to max
305
+ void set_kmax(int max);
306
+ //@}
307
+ };
308
+
309
+ /// Class for edges \f$ e(x,v) \f$ in the variable-value-graph
310
+ class Edge{
311
+ private:
312
+ /// pointer to the variable node
313
+ VarNode* x;
314
+ /// pointer to the value node
315
+ ValNode* v;
316
+ /// pointer to the next edge incident on the same variable node
317
+ Edge* next_edge;
318
+ /// pointer to the previous edge incident on the same variable node
319
+ Edge* prev_edge;
320
+ /// pointer to the next edge on the same value node
321
+ Edge* next_vedge;
322
+ /// pointer to the previous edge on the same value node
323
+ Edge* prev_vedge;
324
+ /**
325
+ * \brief stores whether the edge is used in LBC
326
+ * Flag storing whether the edge is used in any maximum LBC matching
327
+ * in the variable-value-graph
328
+ */
329
+ bool mrklb;
330
+ /**
331
+ * \brief stores whether the edge is used in UBC
332
+ * Flag storing whether the edge is used in any maximum UBC matching
333
+ * in the variable-value-graph
334
+ */
335
+ bool mrkub;
336
+ /// stores whether the edge is matched in LBC matching
337
+ bool um;
338
+ /// stores whether the edge is matched in UBC matching
339
+ bool lm;
340
+ /// stores whether the edge has been deleted during syncronization
341
+ bool deleted; // del
342
+
343
+ public:
344
+ /// \name Constructors
345
+ //@{
346
+ /**
347
+ * \brief Construct edge \f$e(x,v)\f$ from variable node \a x
348
+ * and value node \a y
349
+ */
350
+ Edge(VarNode* x, ValNode* v);
351
+ /// Create a new edge in memory
352
+ void* operator new(size_t, void*);
353
+ //@}
354
+
355
+ /// \name Access
356
+ //@{
357
+ /**
358
+ * \brief return whether the edge is used
359
+ *
360
+ * An edge can be used in a matching on the graph,
361
+ * a path on the graph or a cycle in the graph.
362
+ *
363
+ */
364
+ template <BC>
365
+ bool used(void);
366
+ /// return whether the edge is matched
367
+ template <BC>
368
+ bool matched(void);
369
+ /// return whether the edge has been deleted from the graph
370
+ bool is_deleted(void);
371
+ /**
372
+ * \brief return a pointer to the next edge
373
+ * If \a t is false the function returns the next edge incident on \a x
374
+ * otherwise it returns the next edge incident on \a v
375
+ */
376
+ Edge* next(bool t) const;
377
+ /// return the pointer to the next edge incident on \a x
378
+ Edge* next(void) const;
379
+ /// return the pointer to the previous edge incident on \a x
380
+ Edge* prev(void) const;
381
+ /// return the pointer to the next edge incident on \a v
382
+ Edge* vnext(void) const;
383
+ /// return the pointer to the previous edge incident on \a v
384
+ Edge* vprev(void) const;
385
+ /// return the pointer to the variable node \a x of this edge
386
+ VarNode* getVar(void);
387
+ /// return the pointer to the value node \a v of this edge
388
+ ValNode* getVal(void);
389
+ /**
390
+ * \brief return pointer to \a x if \a t = true otherwise return \a v
391
+ *
392
+ */
393
+ VVGNode* getMate(bool t);
394
+ //@}
395
+
396
+ /// Update
397
+ //@{
398
+ /// Mark the edge as used
399
+ template <BC>
400
+ void use(void);
401
+ /// Mark the edge as unused
402
+ template <BC>
403
+ void free(void);
404
+ /**
405
+ * \brief Reset the edge ( free the edge, and unmatch
406
+ * the edge including its end-nodes
407
+ *
408
+ */
409
+ template <BC>
410
+ void reset(void);
411
+ /// Match the edge
412
+ template <BC>
413
+ void match(void);
414
+ /// Unmatch the edge and the incident nodes
415
+ template <BC>
416
+ void unmatch(void);
417
+ /// Unmatch the edge and ( \a x if t=false, \a v otherwise )
418
+ template <BC>
419
+ void unmatch(bool t);
420
+ /// Unlink the edge from the linked list of edges
421
+ void unlink(void);
422
+ /// Mark the edge as deleted during synchronization
423
+ void del_edge(void);
424
+ /// Insert the edge again
425
+ void insert_edge(void);
426
+ /// return the reference to the next edge incident on \a x
427
+ Edge** next_ref(void);
428
+ /// return the reference to the previous edge incident on \a x
429
+ Edge** prev_ref(void);
430
+ /// return the reference to the next edge incident on \a v
431
+ Edge** vnext_ref(void);
432
+ /// return the reference to the previous edge incident on \a v
433
+ Edge** vprev_ref(void);
434
+ //@}
435
+ };
436
+
437
+ }}}
438
+
439
+ /// Debugging: print a variable node
440
+ inline std::ostream&
441
+ operator<<(std::ostream& os, Gecode::Int::GCC::VarNode* v) {
442
+ os << v->var<<":{";
443
+ for (Gecode::Int::GCC::Edge* e = v->first(); e != NULL; e = e->next()) {
444
+ os << e->getVal()->val<<",";
445
+ }
446
+ os << "}(";
447
+ os << v->xindex << ") ";
448
+ return os;
449
+ }
450
+
451
+ /// Debugging: print a value node
452
+ inline std::ostream&
453
+ operator<<(std::ostream& os, Gecode::Int::GCC::ValNode* v) {
454
+ os << v->val<<":{";
455
+ for (Gecode::Int::GCC::Edge* e = v->first(); e != NULL; e = e->vnext()) {
456
+ os << e->getVar()->var<<",";
457
+ }
458
+ os << "} ";
459
+ return os;
460
+ }
461
+
462
+ namespace Gecode { namespace Int { namespace GCC {
463
+
464
+ /**
465
+ * \brief Variable-value-graph used during propagation
466
+ *
467
+ */
468
+ template <class View, class Card, bool isView>
469
+ class VarValGraph {
470
+ private:
471
+ /// failure flag
472
+ bool fail;
473
+ /// Allocated memory for nodes and edges
474
+ char* mem;
475
+ /// How much memory is allocated
476
+ size_t _allocated;
477
+ /// Problem variables
478
+ ViewArray<View>& x;
479
+ /// Copy keeping track of removed variables
480
+ ViewArray<View>& y;
481
+ /// Occurences
482
+ ViewArray<Card>& k;
483
+ /// Variable partition representing the problem variables
484
+ VarNode** vars;
485
+ /**
486
+ * \brief Value partition
487
+ * For each value
488
+ * \f$ v_i\in V=\left(\bigcup_\{0, \dots, |x|-1\}\right) D_i \f$
489
+ * in the domains of the
490
+ * problem variables there is a node in the graph.
491
+ */
492
+ ValNode** vals; // value partition De
493
+ /// the edges connecting the variable and the value partition
494
+ Edge* edges; // edges e
495
+ /// cardinality of the variable partition
496
+ int n_var;
497
+ /**
498
+ * \brief cardinality of the value partition
499
+ *
500
+ * Computed as \f$ |V| = \left(\bigcup_\{0, \dots, |x|-1\}\right) D_i \f$
501
+ */
502
+ int n_val;
503
+ /// the number of edges in the graph
504
+ int n_edge;
505
+ /// total number of nodes in the graph
506
+ int node_size;
507
+ /**
508
+ * \brief The sum over the minimal capacities of all value nodes
509
+ *
510
+ * \f$sum_min = \sum_{v_i \in V} l_i= k[i].min() \f$
511
+ */
512
+ int sum_min;
513
+ /**
514
+ * \brief The sum over the maximal capacities of all value nodes
515
+ *
516
+ * \f$sum_max = \sum_{v_i \in V} l_i= k[i].max() \f$
517
+ */
518
+ int sum_max;
519
+ public:
520
+ /// \name Constructors and Destructors
521
+ //@{
522
+ VarValGraph(ViewArray<View>&, ViewArray<View>&, ViewArray<Card>&,
523
+ int , int , int );
524
+ /// Destructor
525
+ ~VarValGraph(void);
526
+ //@}
527
+ size_t allocated(void) const;
528
+ /// \name Graph-interface
529
+ //@{
530
+ /**
531
+ * \brief Check whether propagation failed
532
+ * This is actually needed to cope with failures
533
+ * occuring in functions returing only a boolean value
534
+ * and not an ExecStatus.
535
+ */
536
+ bool failed(void) const;
537
+ /**
538
+ * \brief Set the failure flag of the graph
539
+ */
540
+ void failed(bool b);
541
+
542
+ /**
543
+ * \brief Check whether minimum requirements shrink variable domains
544
+ *
545
+ */
546
+ bool min_require(Space* home);
547
+
548
+ /**
549
+ * \brief Synchronization of the graph
550
+ *
551
+ * If the graph has already been constructed and some edges have
552
+ * been removed during propagation \fn sync removes those edges
553
+ * that do not longer belong to the graph associated with the current
554
+ * variable domains.
555
+ */
556
+ bool sync(void);
557
+
558
+ /// Print graph information for debugging
559
+ void print_graph(void);
560
+ /// Print matching information for debugging
561
+ template <BC>
562
+ void print_matching(void);
563
+ /// Gather matching information
564
+ void print_match(void);
565
+
566
+ /// Print edge information
567
+ void print_edges(void);
568
+
569
+ /// Allocate memory for the graph
570
+ void* operator new(size_t t);
571
+ /// Free the memory for the graph
572
+ void operator delete(void* p);
573
+
574
+ /**
575
+ * \brief Remove all those edges from the graph
576
+ * that do not belong
577
+ * to any possible maximum matching on the graph
578
+ *
579
+ */
580
+
581
+ template <BC>
582
+ bool narrow(Space*);
583
+
584
+ /** \brief Compute a maximum matching M on the graph
585
+ *
586
+ * - If BC=UBC then \f$|M|= |X|\f$
587
+ * - If BC=LBC then \f$|M|= \sum_{i\in \{ 0, \dots, |X|-1\}}
588
+ * k[i].min()\f$
589
+ */
590
+ template <BC>
591
+ bool maximum_matching(void);
592
+
593
+ /// Compute possible free alternating paths in the graph
594
+ template <BC>
595
+ void free_alternating_paths(void);
596
+ /// Compute possible strongly connected components of the graph
597
+ template <BC>
598
+ void strongly_connected_components(void);
599
+ /**
600
+ * \brief Test whether the current maximal matching on the graph
601
+ * can be augmented by an alternating path starting and ending with
602
+ * a free node.
603
+ */
604
+ template <BC>
605
+ bool augmenting_path(VVGNode*);
606
+
607
+ protected:
608
+ /**
609
+ * \brief Perform depth-first search on the graph
610
+ *
611
+ * Depth first search used to compute the
612
+ * strongly connected components of the graph.
613
+ */
614
+ template <BC>
615
+ void dfs(VVGNode*,
616
+ bool[], bool[], int[],
617
+ Support::StaticStack<VVGNode*>&,
618
+ Support::StaticStack<VVGNode*>&,
619
+ int&);
620
+
621
+ //@}
622
+ };
623
+
624
+ forceinline
625
+ VVGNode::VVGNode(void){} //no-op
626
+
627
+ forceinline void*
628
+ VVGNode::operator new(size_t, void* p){
629
+ return p;
630
+ }
631
+
632
+ forceinline Edge**
633
+ VVGNode::adj(void){
634
+ return &e;
635
+ }
636
+
637
+ forceinline Edge*
638
+ VVGNode::first(void){
639
+ return fst;
640
+ }
641
+
642
+ forceinline Edge*
643
+ VVGNode::last(void){
644
+ return lst;
645
+ }
646
+
647
+ forceinline void
648
+ VVGNode::first(Edge* p){
649
+ fst = p;
650
+ }
651
+
652
+ forceinline void
653
+ VVGNode::last(Edge* p){
654
+ lst = p;
655
+ }
656
+
657
+ forceinline bool
658
+ VVGNode::get_type(void){
659
+ return type;
660
+ }
661
+
662
+ forceinline void
663
+ VVGNode::set_type(bool b){
664
+ type = b;
665
+ }
666
+
667
+ forceinline Edge*
668
+ VVGNode::inedge(void){
669
+ return ie;
670
+ }
671
+
672
+ forceinline void
673
+ VVGNode::inedge(Edge* p){
674
+ ie = p;
675
+ }
676
+
677
+ template <BC direction>
678
+ forceinline void
679
+ VVGNode::set_match_flag(bool b){
680
+ if (direction == UBC) {
681
+ um = b;
682
+ } else {
683
+ lm = b;
684
+ }
685
+ }
686
+
687
+ template <BC direction>
688
+ forceinline bool
689
+ VVGNode::get_match_flag(void){
690
+ if (direction == UBC) {
691
+ return um;
692
+ } else {
693
+ return lm;
694
+ }
695
+ }
696
+
697
+
698
+ /// Variable Node
699
+
700
+ forceinline bool
701
+ VarNode::removed(void) {
702
+ return noe == 0;
703
+ }
704
+
705
+
706
+
707
+ forceinline
708
+ VarNode::VarNode(int x, int orig_idx) :
709
+ ubm(NULL), lbm(NULL), var(x), noe(0), xindex(orig_idx){
710
+ first(NULL);
711
+ last(NULL);
712
+ inedge(NULL);
713
+ unmatch<LBC>();
714
+ unmatch<UBC>();
715
+ set_type(false);
716
+ }
717
+
718
+ forceinline bool
719
+ VarNode::is_matched(BC d) {
720
+ if (d == UBC) {
721
+ return matched<UBC>();
722
+ } else {
723
+ return matched<LBC>();
724
+ }
725
+ }
726
+
727
+ template <BC direction>
728
+ forceinline bool
729
+ VarNode::matched(void){
730
+ return get_match_flag<direction>();
731
+ }
732
+
733
+ template <BC direction>
734
+ forceinline void
735
+ VarNode::match(void){
736
+ set_match_flag<direction>(true);
737
+ }
738
+
739
+ template <BC direction>
740
+ forceinline void
741
+ VarNode::unmatch(void){
742
+ set_match_flag<direction>(false);
743
+ set_match<direction>(NULL);
744
+ }
745
+
746
+ template <BC direction>
747
+ forceinline void
748
+ VarNode::set_match(Edge* p){
749
+ if (direction == UBC) {
750
+ ubm = p;
751
+ } else {
752
+ lbm = p;
753
+ }
754
+ }
755
+
756
+ template <BC direction>
757
+ forceinline Edge*
758
+ VarNode::get_match(void){
759
+ if (direction == UBC) {
760
+ return ubm;
761
+ } else {
762
+ return lbm;
763
+ }
764
+ }
765
+
766
+ forceinline void
767
+ VarNode::set_info(int i){
768
+ var = i;
769
+ }
770
+
771
+ forceinline int
772
+ VarNode::get_info(void){
773
+ return var;
774
+ }
775
+
776
+ /// Value Node
777
+
778
+ forceinline void
779
+ ValNode::set_maxlow(int i){
780
+ assert(i >= lb);
781
+ ublow = i;
782
+ }
783
+
784
+ forceinline int
785
+ ValNode::get_maxlow(void) {
786
+ if (_klb == _kub) {
787
+ assert(ublow == lb);
788
+ }
789
+
790
+ return ublow;
791
+ }
792
+
793
+
794
+ forceinline void
795
+ ValNode::card_conflict(int c){
796
+ noc = c;
797
+ }
798
+
799
+ forceinline void
800
+ ValNode::red_conflict(void){
801
+ noc--;
802
+ assert(noc >= 0);
803
+ }
804
+
805
+ forceinline int
806
+ ValNode::card_conflict(void){
807
+ return noc;
808
+ }
809
+
810
+ forceinline bool
811
+ ValNode::removed(void) {
812
+ return noe == 0;
813
+ }
814
+
815
+ forceinline bool
816
+ ValNode::is_matched(BC d) {
817
+ if (d == UBC) {
818
+ return matched<UBC>();
819
+ } else {
820
+ return ublow == 0;
821
+ }
822
+ }
823
+
824
+ forceinline void
825
+ ValNode::reset(void){
826
+ lb = _klb;
827
+ ublow = _kub;
828
+ ub = _kub;
829
+ noe = 0;
830
+ }
831
+
832
+ template <BC direction>
833
+ forceinline int
834
+ ValNode::kbound(void){
835
+ if (direction == UBC) {
836
+ return _kub;
837
+ } else {
838
+ return _klb;
839
+ }
840
+ }
841
+
842
+ forceinline int
843
+ ValNode::kmax(void){
844
+ return _kub;
845
+ }
846
+
847
+ forceinline int
848
+ ValNode::kmin(void){
849
+ return _klb;
850
+ }
851
+
852
+ forceinline void
853
+ ValNode::set_kmin(int klb){
854
+ _klb = klb;
855
+ }
856
+
857
+ forceinline void
858
+ ValNode::set_kmax(int kub){
859
+ _kub = kub;
860
+ }
861
+
862
+ template <BC direction>
863
+ forceinline int
864
+ ValNode::cap(void){
865
+ if (direction == UBC) {
866
+ return ub;
867
+ } else {
868
+ return lb;
869
+ }
870
+ }
871
+
872
+ template <BC direction>
873
+ forceinline void
874
+ ValNode::dec(void){
875
+ if (direction == UBC) {
876
+ ub--;
877
+ } else {
878
+ lb--;
879
+ ublow--;
880
+ }
881
+ }
882
+
883
+ template <BC direction>
884
+ forceinline void
885
+ ValNode::inc(void){
886
+ if (direction == UBC) {
887
+ ub++;
888
+ } else {
889
+ lb++;
890
+ ublow++;
891
+ }
892
+ }
893
+
894
+ template <BC direction>
895
+ forceinline void
896
+ ValNode::match(void){
897
+ dec<direction>();
898
+ }
899
+
900
+ template <BC direction>
901
+ forceinline void
902
+ ValNode::unmatch(void){
903
+ inc<direction>();
904
+ }
905
+
906
+ template <BC direction>
907
+ forceinline bool
908
+ ValNode::matched(void){
909
+ return ( cap<direction>() == 0);
910
+ }
911
+
912
+ forceinline
913
+ ValNode::ValNode(int min, int max, int value,
914
+ int kidx, int kshift, int count) :
915
+ _klb(min), _kub(max), _kidx(kidx), _kcount(count),
916
+ noc(0),
917
+ lb(min), ublow(max), ub(max),
918
+ val(value), idx(kshift), noe(0) {
919
+ first(NULL);
920
+ last(NULL);
921
+ inedge(NULL);
922
+ Edge** vadjacent = adj();
923
+ *vadjacent = NULL;
924
+ set_type(true);
925
+ }
926
+
927
+ template<BC direction>
928
+ forceinline void
929
+ ValNode::set_cap(int c){
930
+ if (direction == UBC) {
931
+ ub = c;
932
+ } else {
933
+ lb = c;
934
+ // ublow = c;
935
+ }
936
+ }
937
+
938
+ forceinline void
939
+ ValNode::set_info(int i){
940
+ idx = i;
941
+ }
942
+
943
+ forceinline int
944
+ ValNode::get_info(void){
945
+ return idx;
946
+ }
947
+
948
+ forceinline void
949
+ ValNode::inc(void) {
950
+ _kcount++;
951
+ }
952
+
953
+ forceinline int
954
+ ValNode::kcount(void) {
955
+ return _kcount;
956
+ }
957
+
958
+ forceinline void
959
+ ValNode::kcount(int c) {
960
+ _kcount = c;
961
+ }
962
+
963
+ forceinline void
964
+ ValNode::kindex(int i){
965
+ _kidx = i;
966
+ }
967
+
968
+ forceinline int
969
+ ValNode::kindex(void){
970
+ return _kidx;
971
+ }
972
+
973
+ /// Returs the number of incident matching edges on the node
974
+ template <BC direction>
975
+ forceinline int
976
+ ValNode::incid_match(void){
977
+ if (direction == LBC) {
978
+ // std::cout << "LBC: "<< _kub <<"-"<<ublow <<"+"<<_kcount<<"\n";
979
+ return _kub - ublow + _kcount;
980
+ } else {
981
+ // std::cout << "UBC: "<< _kub <<"-"<<ub <<"+"<<_kcount<<"\n";
982
+ return _kub - ub + _kcount;
983
+ }
984
+ }
985
+
986
+
987
+ forceinline bool
988
+ ValNode::sink(void){
989
+ // there are only incoming edges
990
+ // in case of the UBC-matching
991
+ bool is_sink = false;
992
+ is_sink = (_kub - ub == noe);
993
+ return is_sink;
994
+ }
995
+
996
+ forceinline bool
997
+ ValNode::source(void){
998
+ // there are only incoming edges
999
+ // in case of the UBC-matching
1000
+ bool is_sink = false;
1001
+ is_sink = (_klb - lb == noe);
1002
+ return is_sink;
1003
+ }
1004
+
1005
+ }}}
1006
+
1007
+ /// Edge
1008
+ /// Debugging: print an edge
1009
+ inline std::ostream&
1010
+ operator<<(std::ostream& os, Gecode::Int::GCC::Edge* e){
1011
+ if (e== NULL) {
1012
+ os << "(N)";
1013
+ } else {
1014
+ os << "e("<<e->getVar()->var<<","<<e->getVal()->val<<")";
1015
+ }
1016
+ return os;
1017
+ }
1018
+
1019
+ namespace Gecode { namespace Int { namespace GCC {
1020
+
1021
+ forceinline void
1022
+ Edge::unlink(void){
1023
+ // unlink from variable side
1024
+ Edge* p = prev_edge;
1025
+ Edge* n = next_edge;
1026
+
1027
+ if (p != NULL) {
1028
+ Edge** pnext = p->next_ref();
1029
+ *pnext = n;
1030
+ }
1031
+
1032
+ if (n != NULL) {
1033
+ Edge** nprev = n->prev_ref();
1034
+ *nprev = p;
1035
+ }
1036
+
1037
+ if (this == x->first()) {
1038
+ Edge** ref = x->adj();
1039
+ *ref = n;
1040
+ x->first(n);
1041
+ }
1042
+
1043
+ if (this == x->last()) {
1044
+ x->last(p);
1045
+ }
1046
+
1047
+ // unlink from value side
1048
+ Edge* pv = prev_vedge;
1049
+ Edge* nv = next_vedge;
1050
+
1051
+ if (pv != NULL) {
1052
+ Edge** pvnext = pv->vnext_ref();
1053
+ *pvnext = nv;
1054
+ }
1055
+
1056
+ if (nv != NULL) {
1057
+ Edge** nvprev = nv->vprev_ref();
1058
+ *nvprev = pv;
1059
+ }
1060
+
1061
+ if (this == v->first()) {
1062
+ Edge** ref = v->adj();
1063
+ *ref = nv;
1064
+ v->first(nv);
1065
+ }
1066
+
1067
+ if (this == v->last()) {
1068
+ v->last(pv);
1069
+ }
1070
+ }
1071
+
1072
+ forceinline
1073
+ Edge::Edge(VarNode* var, ValNode* val) :
1074
+ x(var), v(val),
1075
+ next_edge(NULL), prev_edge(NULL),
1076
+ next_vedge(NULL), prev_vedge(NULL),
1077
+ mrklb(false), mrkub(false),
1078
+ um(false), lm(false), deleted(false) {};
1079
+
1080
+ forceinline void*
1081
+ Edge::operator new(size_t, void* p){ //why is there no argument?
1082
+ return p;
1083
+ }
1084
+
1085
+ template <BC direction>
1086
+ forceinline void
1087
+ Edge::use(void){
1088
+ if (direction == UBC) {
1089
+ mrkub = true;
1090
+ } else {
1091
+ mrklb = true;
1092
+ }
1093
+ }
1094
+
1095
+ template <BC direction>
1096
+ forceinline void
1097
+ Edge::free(void){
1098
+ /// the failure is here, capacity is not increased for value nodes
1099
+ if (direction == UBC) {
1100
+ mrkub = false;
1101
+ } else {
1102
+ mrklb = false;
1103
+ }
1104
+ }
1105
+
1106
+ template <BC direction>
1107
+ forceinline void
1108
+ Edge::reset(void){
1109
+ this->free<direction>();
1110
+ this->unmatch<direction>();
1111
+ }
1112
+
1113
+ template <BC direction>
1114
+ forceinline bool
1115
+ Edge::used(void){
1116
+ if (direction == UBC){
1117
+ return mrkub;
1118
+ } else {
1119
+ return mrklb;
1120
+ }
1121
+ }
1122
+
1123
+ forceinline Edge*
1124
+ Edge::next(void) const{
1125
+ return next_edge;
1126
+ }
1127
+
1128
+ forceinline Edge*
1129
+ Edge::next(bool t) const{
1130
+ if (t) {
1131
+ return next_vedge;
1132
+ } else {
1133
+ return next_edge;
1134
+ }
1135
+ }
1136
+
1137
+ forceinline Edge*
1138
+ Edge::vnext(void) const{
1139
+ return next_vedge;
1140
+ }
1141
+
1142
+ forceinline Edge**
1143
+ Edge::vnext_ref(void) {
1144
+ return &next_vedge;
1145
+ }
1146
+
1147
+ forceinline Edge*
1148
+ Edge::prev(void) const{
1149
+ return prev_edge;
1150
+ }
1151
+
1152
+ forceinline Edge**
1153
+ Edge::prev_ref(void) {
1154
+ return &prev_edge;
1155
+ }
1156
+
1157
+ forceinline Edge*
1158
+ Edge::vprev(void) const{
1159
+ return prev_vedge;
1160
+ }
1161
+
1162
+ forceinline Edge**
1163
+ Edge::vprev_ref(void) {
1164
+ return &prev_vedge;
1165
+ }
1166
+
1167
+ forceinline Edge**
1168
+ Edge::next_ref(void){
1169
+ return &next_edge;
1170
+ }
1171
+ forceinline VarNode*
1172
+ Edge::getVar(void){
1173
+ assert(x != NULL);
1174
+ return x;
1175
+ }
1176
+
1177
+ forceinline ValNode*
1178
+ Edge::getVal(void){
1179
+ assert(v != NULL);
1180
+ return v;
1181
+ }
1182
+
1183
+ forceinline VVGNode*
1184
+ Edge::getMate(bool type){
1185
+ if (type) {
1186
+ return x;
1187
+ } else {
1188
+ return v;
1189
+ }
1190
+ }
1191
+
1192
+ template <BC direction>
1193
+ forceinline void
1194
+ Edge::unmatch(void){
1195
+ if (direction == UBC) {
1196
+ um = false;
1197
+ } else {
1198
+ lm = false;
1199
+ }
1200
+ x->unmatch<direction>();
1201
+ v->unmatch<direction>();
1202
+ }
1203
+
1204
+ template <BC direction>
1205
+ forceinline void
1206
+ Edge::unmatch(bool node){
1207
+ if (direction == UBC) {
1208
+ um = false;
1209
+ } else {
1210
+ lm = false;
1211
+ }
1212
+ if (node) {
1213
+ v->template unmatch<direction>();
1214
+ } else {
1215
+ x->template unmatch<direction>();
1216
+ }
1217
+ }
1218
+
1219
+ template <BC direction>
1220
+ forceinline void
1221
+ Edge::match(void){
1222
+ if (direction == UBC) {
1223
+ um = true;
1224
+ x->template match<direction>();
1225
+ x->template set_match<direction>(this);
1226
+ v->template match<direction>();
1227
+ } else {
1228
+ lm = true;
1229
+ x->template match<direction>();
1230
+ x->template set_match<direction>(this);
1231
+ assert(x->template matched<direction>());
1232
+ v->template match<direction>();
1233
+ // assert(v->template matched<direction>());
1234
+ }
1235
+ }
1236
+
1237
+ template <BC direction>
1238
+ forceinline bool
1239
+ Edge::matched(void){
1240
+ if (direction == UBC) {
1241
+ return um;
1242
+ } else {
1243
+ return lm;
1244
+ }
1245
+ }
1246
+
1247
+ forceinline void
1248
+ Edge::del_edge(void){
1249
+ deleted = true;
1250
+ }
1251
+
1252
+ forceinline void
1253
+ Edge::insert_edge(void){
1254
+ deleted = false;
1255
+ }
1256
+
1257
+
1258
+ forceinline bool
1259
+ Edge::is_deleted(void){
1260
+ return deleted;
1261
+ }
1262
+
1263
+ /**
1264
+ * \brief Constructor for the variable-value-graph
1265
+ *
1266
+ * The variable parition is initialized with the variables from \a x,
1267
+ * the value partition is initialized with the values from \a v,
1268
+ * where \f$ \forall v_i\in V:\f$ \a val_idx[i] is the
1269
+ * index of \f$ v_i\f$ in \f$ k \f$. \a nov denotes the cardinality of the
1270
+ * value partition in the graph, \a noe the number of edges in the
1271
+ * graph, \a min_occ the sum over the minimal occurences
1272
+ * of all values and \a max_occ the sum over the maximal occurences
1273
+ * of all values.
1274
+ **/
1275
+
1276
+ template <class View, class Card, bool isView>
1277
+ VarValGraph<View, Card, isView>::VarValGraph(ViewArray<View>& xref,
1278
+ ViewArray<View>& yref,
1279
+ ViewArray<Card>& kref,
1280
+ int noe,
1281
+ int smin, int smax)
1282
+ : fail(false),
1283
+ x(xref),
1284
+ y(yref),
1285
+ k(kref),
1286
+ n_var(x.size()),
1287
+ n_val(k.size()),
1288
+ n_edge(noe),
1289
+ node_size(n_var + n_val),
1290
+ sum_min(smin),
1291
+ sum_max(smax) {
1292
+
1293
+ //memory allocation
1294
+ size_t edge_size = sizeof(Edge) * n_edge;
1295
+ size_t var_size = sizeof(VarNode) * n_var;
1296
+ size_t var_ptr_size = sizeof(VarNode*) * n_var;
1297
+ size_t val_size = sizeof(ValNode) * n_val;
1298
+ size_t val_ptr_size = sizeof(ValNode*) * n_val;
1299
+ size_t size = edge_size + var_size + var_ptr_size +
1300
+ val_size + val_ptr_size;
1301
+
1302
+ _allocated = size;
1303
+
1304
+ mem = static_cast<char*>
1305
+ (Memory::malloc(size));
1306
+ edges = Support::ptr_cast<Edge*>
1307
+ (mem);
1308
+ VarNode* vars_ptr = Support::ptr_cast<VarNode*>
1309
+ (mem + edge_size);
1310
+ ValNode* vals_ptr = Support::ptr_cast<ValNode*>
1311
+ (mem + edge_size + var_size);
1312
+ vars = Support::ptr_cast<VarNode**>
1313
+ (mem + edge_size + var_size + val_size);
1314
+ vals = Support::ptr_cast<ValNode**>
1315
+ (mem + edge_size + var_size + val_size + var_ptr_size);
1316
+
1317
+ for (int i = n_val; i--; ){
1318
+ int kmi = k[i].min();
1319
+ int kma = k[i].max();
1320
+ int kc = k[i].counter();
1321
+ if (kc != kma) {
1322
+ if (kmi >= kc) {
1323
+ kmi -=kc;
1324
+ assert(kmi >=0);
1325
+ } else {
1326
+ kmi = 0;
1327
+ }
1328
+ kma -= kc;
1329
+ assert (kma > 0);
1330
+ vals[i] = new (vals_ptr + i)
1331
+ ValNode(kmi, kma, k[i].card(), i, i + n_var, kc);
1332
+ } else {
1333
+ vals[i] = new (vals_ptr + i)
1334
+ ValNode(0, 0, k[i].card(), i, i + n_var, kc);
1335
+ }
1336
+ }
1337
+
1338
+ for (int i = n_var; i--; ){
1339
+
1340
+ vars[i] = new (vars_ptr + i) VarNode(i, i);
1341
+ VarNode* vrn = vars[i];
1342
+ // get the space for the edges of the varnode
1343
+ Edge** xadjacent = vrn->adj();
1344
+
1345
+ ViewValues<View> xiter(x[i]);
1346
+ int j = 0;
1347
+ for (; xiter(); ++xiter){
1348
+ int v = xiter.val();
1349
+ // get the correct index for the value
1350
+ while(vals[j]->val < v){
1351
+ j++;
1352
+ }
1353
+ ValNode* vln = vals[j];
1354
+ *xadjacent = new (edges) Edge(vars_ptr + i, vals_ptr + j);
1355
+ vrn->noe++;
1356
+ if (vrn->first() == NULL) {
1357
+ vrn->first(*xadjacent);
1358
+ }
1359
+ Edge* oldprev = vrn->last();
1360
+ vrn->last(*xadjacent);
1361
+ Edge** newprev = vrn->last()->prev_ref();
1362
+ *newprev = oldprev;
1363
+
1364
+ if (vln->first() == NULL) {
1365
+ vln->first(*xadjacent);
1366
+ vln->last(*xadjacent);
1367
+ vln->noe++;
1368
+ } else {
1369
+ Edge* old = vln->first();
1370
+ vln->first(*xadjacent);
1371
+ Edge** newnext = vln->first()->vnext_ref();
1372
+ *newnext = old;
1373
+ Edge** setprev = old->vprev_ref();
1374
+ *setprev = vln->first();
1375
+ vln->noe++;
1376
+ }
1377
+ edges++;
1378
+ xadjacent = (*xadjacent)->next_ref();
1379
+ }
1380
+ *xadjacent = NULL;
1381
+ }
1382
+ }
1383
+
1384
+ template <class View, class Card, bool isView>
1385
+ forceinline size_t
1386
+ VarValGraph<View, Card, isView>::allocated(void) const {
1387
+ return _allocated + sizeof(VarValGraph<View, Card, isView>);
1388
+ }
1389
+
1390
+ template <class View, class Card, bool isView>
1391
+ forceinline bool
1392
+ VarValGraph<View, Card, isView>::failed(void) const {
1393
+ return fail;
1394
+ }
1395
+
1396
+ template <class View, class Card, bool isView>
1397
+ forceinline void
1398
+ VarValGraph<View, Card, isView>::failed(bool b){
1399
+ fail = b;
1400
+ }
1401
+
1402
+
1403
+
1404
+ template <class View, class Card, bool isView>
1405
+ inline bool
1406
+ VarValGraph<View, Card, isView>::min_require(Space* home){
1407
+ bool modified = false;
1408
+ for (int i = n_val; i--; ) {
1409
+ ValNode* vln = vals[i];
1410
+ if (vln->noe > 0) {
1411
+ if (k[i].min() == vln->noe) {
1412
+ // all variable nodes reachable from vln should be equal to vln->val
1413
+ for (Edge* e = vln->first(); e != NULL; e = e->vnext()) {
1414
+ VarNode* vrn = e->getVar();
1415
+ int vi = vrn->get_info();
1416
+ for (Edge* f = vrn->first(); f != NULL; f = f->next()) {
1417
+ if (f != e) {
1418
+ ValNode* w = f->getVal();
1419
+ w->noe--;
1420
+ vrn->noe--;
1421
+ f->del_edge();
1422
+ f->unlink();
1423
+ }
1424
+ }
1425
+ assert(vrn->noe == 1);
1426
+
1427
+ ModEvent me = x[vi].eq(home, vln->val);
1428
+ if (me_failed(me))
1429
+ failed(true);
1430
+ if (me_modified(me))
1431
+ modified = true;
1432
+
1433
+ vars[vi] = vars[--n_var];
1434
+ vars[vi]->set_info(vi);
1435
+
1436
+ int n = x.size();
1437
+ x[vi] = x[--n];
1438
+ x.size(n);
1439
+
1440
+ node_size--;
1441
+ vln->noe--;
1442
+ }
1443
+
1444
+
1445
+ int vidx = vln->kindex();
1446
+ if (isView) {
1447
+ ModEvent me = k[vidx].eq(home, k[vidx].min());
1448
+ if (me_failed(me))
1449
+ failed(true);
1450
+ if (me_modified(me))
1451
+ modified = true;
1452
+ }
1453
+
1454
+ k[vidx].counter(k[vidx].min());
1455
+
1456
+ vln->template set_cap<UBC>(0);
1457
+ vln->template set_cap<LBC>(0);
1458
+ vln->set_maxlow(0);
1459
+
1460
+ if (sum_min && sum_min >= k[vidx].min()) {
1461
+ sum_min -= k[vidx].min();
1462
+ }
1463
+ assert(sum_min >=0);
1464
+
1465
+ if (sum_max && sum_max >= k[vidx].max()) {
1466
+ sum_max -= k[vidx].max();
1467
+ }
1468
+ assert(sum_max >=0);
1469
+ }
1470
+ } else {
1471
+ vals[i]->template set_cap<UBC>(0);
1472
+ vals[i]->template set_cap<LBC>(0);
1473
+ vals[i]->set_maxlow(0);
1474
+ vals[i]->set_kmax(0);
1475
+ vals[i]->set_kmin(0);
1476
+
1477
+ }
1478
+
1479
+ if (isView) {
1480
+ if (k[i].counter() == 0) {
1481
+ ModEvent me = k[i].lq(home, vals[i]->noe);
1482
+ if (me_failed(me))
1483
+ failed(true);
1484
+ if (me_modified(me) && k[i].max() != vals[i]->noe)
1485
+ modified = true;
1486
+ }
1487
+ }
1488
+ }
1489
+
1490
+ for (int i = n_val; i--; )
1491
+ vals[i]->set_info(n_var + i);
1492
+
1493
+ return modified;
1494
+ }
1495
+
1496
+ template <class View, class Card, bool isView>
1497
+ inline bool
1498
+ VarValGraph<View, Card, isView>::sync(void){
1499
+ GECODE_AUTOARRAY(VVGNode*, re, node_size);
1500
+ int n_re = 0;
1501
+
1502
+ // synchronize cardinality variables
1503
+ if (isView) {
1504
+ for (int i = n_val; i--; ) {
1505
+ ValNode* v = vals[i];
1506
+ int inc_ubc = v->template incid_match<UBC>();
1507
+ int inc_lbc = v->template incid_match<LBC>();
1508
+ if (v->noe == 0) {
1509
+ inc_ubc = 0;
1510
+ inc_lbc = 0;
1511
+ }
1512
+ int rm = v->kmax() - k[i].max();
1513
+ // the cardinality bounds have been modified
1514
+ if (k[i].max() < v->kmax() || k[i].min() > v->kmin()) {
1515
+ if (k[i].max() != k[i].counter() || k[i].max() == 0) {
1516
+ // update the bounds
1517
+ v->set_kmax(k[i].max());
1518
+ v->set_kmin(k[i].min());
1519
+
1520
+ //everything is fine
1521
+ if (inc_ubc <= k[i].max()) {
1522
+ // adjust capacities
1523
+ v->template set_cap<UBC>(k[i].max() - (inc_ubc));
1524
+ v->set_maxlow(k[i].max() - (inc_lbc));
1525
+ if (v->kmin() == v->kmax()) {
1526
+ v->template set_cap<LBC>(k[i].max() - (inc_lbc));
1527
+ }
1528
+ } else {
1529
+ // set cap to max and resolve conflicts on view side
1530
+ // set to full capacity for later rescheduling
1531
+ if (v->template cap<UBC>()) {
1532
+ v->template set_cap<UBC>(k[i].max());
1533
+ }
1534
+ v->set_maxlow(k[i].max() - (inc_lbc));
1535
+ if (v->kmin() == v->kmax()) {
1536
+ v->template set_cap<LBC>(k[i].max() - (inc_lbc));
1537
+ }
1538
+ v->card_conflict(rm);
1539
+ }
1540
+ }
1541
+ }
1542
+ if (inc_lbc < k[i].min() && v->noe > 0) {
1543
+
1544
+ v->template set_cap<LBC>(k[i].min() - inc_lbc);
1545
+ re[n_re] = v;
1546
+ n_re++;
1547
+ }
1548
+ }
1549
+
1550
+ for (int i = n_var; i--; ) {
1551
+ Edge* mub = vars[i]->template get_match<UBC>();
1552
+ if (mub != NULL) {
1553
+ ValNode* vu = mub->getVal();
1554
+ if (! (vars[i]->noe == 1) ) {
1555
+ if (vu->card_conflict()) {
1556
+ vu->red_conflict();
1557
+ mub->template unmatch<UBC>(vars[i]->get_type());
1558
+ re[n_re] = vars[i];
1559
+ n_re++;
1560
+ }
1561
+ }
1562
+ }
1563
+ }
1564
+ }
1565
+
1566
+ // go on with synchronization
1567
+ assert(x.size() == n_var);
1568
+ for (int i = n_var; i--; ) {
1569
+
1570
+ VarNode* vrn = vars[i];
1571
+ if(x[i].size() != vrn->noe){
1572
+ // if the variable is already assigned
1573
+ if (x[i].assigned()) {
1574
+ int v = x[i].val();
1575
+ ValNode* rv = NULL;
1576
+ int rv_idx = 0;
1577
+ Edge* mub = vrn->template get_match<UBC>();
1578
+ if (mub != NULL) {
1579
+ if (v != mub->getVal()->val) {
1580
+ mub->template unmatch<UBC>();
1581
+ re[n_re] = vars[i];
1582
+ n_re++;
1583
+ }
1584
+ }
1585
+
1586
+ Edge* mlb = vrn->template get_match<LBC>();
1587
+ if (mlb != NULL) {
1588
+ ValNode* vln = mlb->getVal();
1589
+ if (v != vln->val) {
1590
+ mlb->template unmatch<LBC>();
1591
+ int nom = vln->template incid_match<LBC>();
1592
+ // less values than required
1593
+ bool cond = nom < vln->kmin();
1594
+ if (cond) {
1595
+ re[n_re] = vln;
1596
+ n_re++;
1597
+ }
1598
+ }
1599
+ }
1600
+
1601
+ for (Edge* e = vrn->first(); e != NULL; e = e->next()){
1602
+ ValNode* vln = e->getVal();
1603
+ if (vln->val != v) {
1604
+ vrn->noe--;
1605
+ e->getVal()->noe--;
1606
+ e->del_edge();
1607
+ e->unlink();
1608
+ } else {
1609
+ rv = e->getVal();
1610
+ rv_idx = rv->kindex();
1611
+ }
1612
+ }
1613
+ } else {
1614
+
1615
+ // delete the edge
1616
+ ViewValues<View> xiter(x[i]);
1617
+ Edge* mub = vrn->template get_match<UBC>();
1618
+ Edge* mlb = vrn->template get_match<LBC>();
1619
+ Edge** p = vrn->adj();
1620
+ Edge* e = *p;
1621
+ do {
1622
+ // search the edge that has to be deleted
1623
+ while (e != NULL && e->getVal()->val < xiter.val()) {
1624
+ // Skip edge
1625
+ e->getVal()->noe--;
1626
+ vrn->noe--;
1627
+ e->del_edge();
1628
+ e->unlink();
1629
+ e = e ->next();
1630
+ *p = e;
1631
+ }
1632
+
1633
+ assert(xiter.val() == e->getVal()->val);
1634
+
1635
+ // This edge must be kept
1636
+ e->template free<UBC>();
1637
+ e->template free<LBC>();
1638
+ ++xiter;
1639
+ p = e->next_ref();
1640
+ e = e->next();
1641
+ } while (xiter());
1642
+ *p = NULL;
1643
+ while (e) {
1644
+ e->getVar()->noe--;
1645
+ e->getVal()->noe--;
1646
+ e->del_edge();
1647
+ e->unlink();
1648
+ e = e->next();
1649
+ }
1650
+
1651
+ if (mub != NULL){
1652
+ if (mub->is_deleted()) {
1653
+ mub->template unmatch<UBC>();
1654
+ re[n_re] = vars[i];
1655
+ n_re++;
1656
+ }
1657
+ }
1658
+
1659
+ //lower bound matching can be zero
1660
+ if (mlb != NULL) {
1661
+ if (mlb->is_deleted()) {
1662
+ ValNode* vln = mlb->getVal();
1663
+ mlb->template unmatch<LBC>();
1664
+ int nom = vln->template incid_match<LBC>();
1665
+ bool cond = nom < vln->kmin();
1666
+ if (cond) {
1667
+ re[n_re] = vln;
1668
+ n_re++;
1669
+ }
1670
+ }
1671
+ }
1672
+ }
1673
+ }
1674
+ vars[i]->set_info(i);
1675
+ }
1676
+
1677
+ for (int i = n_val; i--; ) {
1678
+ if (k[i].min() > vals[i]->noe && k[i].counter() == 0) {
1679
+ failed(true);
1680
+ return false;
1681
+ }
1682
+ vals[i]->set_info(n_var + i);
1683
+ }
1684
+
1685
+ if (n_re == 0) {
1686
+ // no repair needed
1687
+ return true;
1688
+ } else {
1689
+ // start repair
1690
+
1691
+ bool repaired = true;
1692
+ while (n_re ) {
1693
+ n_re--;
1694
+ assert(re[n_re] != NULL);
1695
+ if (!(re[n_re]->removed())) {
1696
+ if (!(re[n_re]->get_type())) {
1697
+ VarNode* vrn = static_cast<VarNode*>(re[n_re]);
1698
+ if (!vrn->template matched<UBC>()) {
1699
+ repaired &= augmenting_path<UBC>(vrn);
1700
+ }
1701
+ } else {
1702
+ assert(re[n_re]->get_type());
1703
+ ValNode* vln = static_cast<ValNode*>(re[n_re]);
1704
+ while(!vln->template matched<LBC>()) {
1705
+ repaired &= augmenting_path<LBC>(vln);
1706
+ if (!repaired) {
1707
+ break;
1708
+ }
1709
+ }
1710
+ }
1711
+ }
1712
+ }
1713
+ return repaired;
1714
+ }
1715
+ }
1716
+
1717
+ template <class View, class Card, bool isView> template <BC direction>
1718
+ inline bool
1719
+ VarValGraph<View, Card, isView>::narrow(Space* home) {
1720
+ bool modified = false;
1721
+ for (int i = n_var; i--; ) {
1722
+ VarNode* vrn = vars[i];
1723
+ if (vrn->noe == 1) {
1724
+ Edge* e = vrn->first();
1725
+ ValNode* v = e->getVal();
1726
+ e->template free<direction>();
1727
+ ModEvent me = x[i].eq(home, v->val);
1728
+ if (me_failed(me)) {
1729
+ failed(true);
1730
+ return false;
1731
+ }
1732
+ if (me_modified(me))
1733
+ modified = true;
1734
+ v->inc();
1735
+ }
1736
+ }
1737
+ for (int i = n_val; i--; ) {
1738
+ ValNode* v = vals[i];
1739
+ if (isView)
1740
+ if (k[i].counter() == 0)
1741
+ if (me_failed(k[i].lq(home, v->noe))) {
1742
+ failed(true);
1743
+ return false;
1744
+ }
1745
+
1746
+ if (v->noe > 0) {
1747
+
1748
+ if (isView)
1749
+ if (me_failed(k[i].lq(home, v->noe))) {
1750
+ failed(true);
1751
+ return false;
1752
+ }
1753
+
1754
+ // If the maximum number of occurences of a value is reached
1755
+ // it cannot be consumed by another view
1756
+
1757
+ if (v->kcount() == v->kmax()) {
1758
+ int vidx = v->kindex();
1759
+
1760
+ k[i].counter(v->kcount());
1761
+
1762
+ if (isView) {
1763
+ if (!k[i].assigned()) {
1764
+ ModEvent me = k[i].eq(home, k[i].counter());
1765
+ if (me_failed(me)) {
1766
+ failed(true);
1767
+ return false;
1768
+ }
1769
+ }
1770
+ }
1771
+
1772
+ bool delall = false;
1773
+ if (v->card_conflict() &&
1774
+ v->noe > v->kmax()) {
1775
+ delall = true;
1776
+
1777
+ }
1778
+
1779
+ for (Edge* e = v->last(); e != NULL; e = e->vprev()) {
1780
+ VarNode* vrn = e->getVar();
1781
+ if (vrn->noe == 1) {
1782
+ vrn->noe--;
1783
+ v->noe--;
1784
+ int vi= vrn->get_info();
1785
+
1786
+ int n = x.size();
1787
+ x[vi] = x[--n];
1788
+ // x[vi].index(vi);
1789
+ x.size(n);
1790
+
1791
+ vars[vi] = vars[--n_var];
1792
+ vars[vi]->set_info(vi);
1793
+ node_size--;
1794
+ e->del_edge();
1795
+ e->unlink();
1796
+
1797
+ } else {
1798
+ if (delall) {
1799
+ if (me_failed(x[vrn->get_info()].nq(home, v->val))) {
1800
+ failed(true);
1801
+ return false;
1802
+ }
1803
+ vrn->noe--;
1804
+ v->noe--;
1805
+ e->del_edge();
1806
+ e->unlink();
1807
+ }
1808
+ }
1809
+ }
1810
+ v->template set_cap<UBC>(0);
1811
+ v->template set_cap<LBC>(0);
1812
+ v->set_maxlow(0);
1813
+ if (sum_min && sum_min >= k[vidx].min()) {
1814
+ sum_min -= k[vidx].min();
1815
+ }
1816
+ assert(sum_min >=0);
1817
+
1818
+ if (sum_max && sum_max >= k[vidx].max()) {
1819
+ sum_max -= k[vidx].max();
1820
+ }
1821
+ assert(sum_max >=0);
1822
+
1823
+ } else {
1824
+ int cur = v->kcount();
1825
+ if (cur > 0) {
1826
+ v->kcount(0);
1827
+ }
1828
+ }
1829
+ }
1830
+ }
1831
+ for (int i = n_var; i--; )
1832
+ vars[i]->set_info(i);
1833
+
1834
+ for (int i = n_val; i--; ) {
1835
+ if (vals[i]->noe == 0) {
1836
+ vals[i]->template set_cap<UBC>(0);
1837
+ vals[i]->template set_cap<LBC>(0);
1838
+ vals[i]->set_maxlow(0);
1839
+ }
1840
+ vals[i]->set_info(n_var + i);
1841
+ }
1842
+
1843
+ for (int i = n_var; i--; )
1844
+ if (vars[i]->noe > 1)
1845
+ for (Edge* e = vars[i]->first(); e != NULL; e = e->next()) {
1846
+ bool keepedge = false;
1847
+ keepedge = (e->template matched<direction>() ||
1848
+ e->template used<direction>());
1849
+ if (!keepedge) {
1850
+ ValNode* v = e->getVal();
1851
+ ModEvent me = x[i].nq(home, v->val);
1852
+ if (me_failed(me)) {
1853
+ failed(true);
1854
+ return false;
1855
+ }
1856
+ if (me_modified(me))
1857
+ modified = true;
1858
+ } else {
1859
+ e->template free<direction>();
1860
+ }
1861
+ }
1862
+ return modified;
1863
+ }
1864
+
1865
+ template <class View, class Card, bool isView> template <BC direction>
1866
+ inline bool
1867
+ VarValGraph<View, Card, isView>::maximum_matching(void){
1868
+
1869
+ int required_size = 0;
1870
+ int card_match = 0;
1871
+
1872
+ if (direction == UBC) {
1873
+ required_size = n_var;
1874
+ } else {
1875
+ required_size = sum_min;
1876
+ }
1877
+
1878
+ // find an intial matching in O(n*d)
1879
+ // greedy algorithm
1880
+
1881
+ for (int i = n_val; i--; ){
1882
+ ValNode* vln = vals[i];
1883
+ for (Edge* e = vln->first(); e != NULL ; e = e->vnext()) {
1884
+ VarNode* vrn = e->getVar();
1885
+ if (!vrn->template matched<direction>() &&
1886
+ !vln->template matched<direction>()) {
1887
+ e->template match<direction>();
1888
+ card_match++;
1889
+ }
1890
+ }
1891
+ }
1892
+
1893
+ if (card_match < required_size) {
1894
+ if (direction == LBC) {
1895
+ // collect free value nodes
1896
+ GECODE_AUTOARRAY(ValNode*, free, n_val);
1897
+ int f = 0;
1898
+ // find failed nodes
1899
+ for (int i = n_val; i--; ) {
1900
+ ValNode* vln = vals[i];
1901
+ if (!vln->template matched<direction>()) {
1902
+ free[f++] = vln;
1903
+ }
1904
+ }
1905
+
1906
+ for (int i = 0; i < f; i++) {
1907
+ while(!free[i]->template matched<direction>()) {
1908
+ if (augmenting_path<direction>(free[i])) {
1909
+ card_match++;
1910
+ } else {
1911
+ break;
1912
+ }
1913
+ }
1914
+ }
1915
+ } else {
1916
+ GECODE_AUTOARRAY(VarNode*, free, n_var);
1917
+ int f = 0;
1918
+ // find failed nodes
1919
+ for (int i = n_var; i--; ) {
1920
+ VarNode* vrn = vars[i];
1921
+ if (!vrn->template matched<direction>()) {
1922
+ free[f++] = vrn;
1923
+ }
1924
+ }
1925
+
1926
+ for (int i = 0; i < f; i++) {
1927
+ if (!free[i]->template matched<direction>()) {
1928
+ if (augmenting_path<direction>(free[i])) {
1929
+ card_match++;
1930
+ }
1931
+ }
1932
+ }
1933
+ }
1934
+ }
1935
+ return (card_match >= required_size);
1936
+ }
1937
+
1938
+ template <class View, class Card, bool isView> template<BC direction>
1939
+ inline bool
1940
+ VarValGraph<View, Card, isView>::augmenting_path(VVGNode* v){
1941
+ Support::StaticStack<VVGNode*> ns(node_size);
1942
+ GECODE_AUTOARRAY(bool, visited, node_size);
1943
+ GECODE_AUTOARRAY(Edge*, start, node_size);
1944
+
1945
+ // augmenting path starting in a free var node
1946
+ assert(!v->is_matched(direction));
1947
+
1948
+ // keep track of the nodes that have already been visited
1949
+ VVGNode* sn = v;
1950
+
1951
+ // mark the start partition
1952
+ bool sp = sn->get_type();
1953
+
1954
+ // nodes in sp only follow free edges
1955
+ // nodes in V - sp only follow matched edges
1956
+
1957
+ for (int i = node_size; i--; ){
1958
+ visited[i] = false;
1959
+ }
1960
+
1961
+ for (int i = node_size; i--; ){
1962
+ if (i >= n_var) {
1963
+ vals[i - n_var]->inedge(NULL);
1964
+ start[i] = vals[i - n_var]->first();
1965
+ } else {
1966
+ vars[i]->inedge(NULL);
1967
+ start[i] = vars[i]->first();
1968
+ }
1969
+ }
1970
+
1971
+ v->inedge(NULL);
1972
+ ns.push(v);
1973
+ visited[v->get_info()] = true;
1974
+ while (!ns.empty()) {
1975
+ VVGNode* v = ns.top();
1976
+ Edge* e = NULL;
1977
+ if (v->get_type() == sp) {
1978
+ // follow next free edge
1979
+ e = start[v->get_info()];
1980
+ while (e != NULL && e->template matched<direction>()) {
1981
+ e = e->next(v->get_type());
1982
+ }
1983
+ } else {
1984
+ e = start[v->get_info()];
1985
+ while (e != NULL && !e->template matched<direction>()) {
1986
+ e = e->next(v->get_type());
1987
+ }
1988
+ start[v->get_info()] = e;
1989
+ }
1990
+ if (e != NULL) {
1991
+ start[v->get_info()] = e->next(v->get_type());
1992
+ VVGNode* w = e->getMate(v->get_type());
1993
+ if (!visited[w->get_info()]) {
1994
+ // unexplored path
1995
+ if (!w->is_matched(direction) && w->get_type() != sp) {
1996
+ if (v->inedge() != NULL) {
1997
+ // augmenting path of length l > 1
1998
+ e->template match<direction>();
1999
+ break;
2000
+ } else {
2001
+ // augmenting path of length l = 1
2002
+ e->template match<direction>();
2003
+ ns.pop();
2004
+ return true;
2005
+ }
2006
+ } else {
2007
+ w->inedge(e);
2008
+ visited[w->get_info()] = true;
2009
+ // find matching edge m incident with w
2010
+ ns.push(w);
2011
+ }
2012
+ }
2013
+ } else {
2014
+ // tried all outgoing edges without finding an augmenting path
2015
+ ns.pop();
2016
+ }
2017
+ }
2018
+
2019
+ bool pathfound = false;
2020
+ if (!ns.empty()) {
2021
+ pathfound = true;
2022
+ }
2023
+
2024
+ while (!ns.empty()) {
2025
+ VVGNode* t = ns.top();
2026
+ if (t != sn) {
2027
+ Edge* in = t->inedge();
2028
+ if (t->get_type() != sp) {
2029
+ assert(in != NULL);
2030
+ in->template match<direction>();
2031
+ } else {
2032
+ // avoid defects
2033
+ if (!sp) {
2034
+ in->template unmatch<direction>(!sp);
2035
+ } else {
2036
+ in->template unmatch<direction>();
2037
+ }
2038
+ }
2039
+ ns.pop();
2040
+ } else {
2041
+ ns.pop();
2042
+ }
2043
+ }
2044
+ return pathfound;
2045
+ }
2046
+
2047
+ template <class View, class Card, bool isView> template<BC direction>
2048
+ inline void
2049
+ VarValGraph<View, Card, isView>::free_alternating_paths(void){
2050
+ Support::StaticStack<VVGNode*> ns(node_size);
2051
+ GECODE_AUTOARRAY(bool, visited, node_size);
2052
+ // keep track of the nodes that have already been visited
2053
+ for (int i = node_size; i--; ){
2054
+ visited[i] = false;
2055
+ }
2056
+
2057
+ if (direction == LBC) {
2058
+ // after a maximum matching on the value nodes there still can be
2059
+ // free value nodes, hence we have to consider ALL nodes whether
2060
+ // they are the starting point of an even alternating path in G
2061
+ for (int i = n_var; i--; ){
2062
+ if(!vars[i]->is_matched(LBC)){
2063
+ // unmatched var-node
2064
+ ns.push(vars[i]);
2065
+ visited[vars[i]->get_info()] = true;
2066
+ }
2067
+ }
2068
+ for (int i = n_val; i--; ){
2069
+ if(!vals[i]->is_matched(LBC)){
2070
+ // unmatched val-node
2071
+ ns.push(vals[i]);
2072
+ visited[vals[i]->get_info()] = true;
2073
+ }
2074
+ }
2075
+
2076
+ } else {
2077
+ // clearly, after a maximum matching on the x variables
2078
+ // corresponding to a set cover on x there are NO free var nodes
2079
+ // std::cout << "alt_path for ubm: \n";
2080
+ // after max_match_ub there can only be free val-nodes
2081
+ for (int i = n_val; i--; ){
2082
+ if(!vals[i]->is_matched(UBC)){
2083
+ // still capacities left
2084
+ ns.push(vals[i]);
2085
+ visited[vals[i]->get_info()] = true;
2086
+ }
2087
+ }
2088
+ }
2089
+
2090
+ while(!ns.empty()){
2091
+ VVGNode* node = ns.top();
2092
+ ns.pop();
2093
+ if (node->get_type()) {
2094
+ // ValNode
2095
+ ValNode* vln = static_cast<ValNode*>(node);
2096
+ for (Edge* cur = vln->first(); cur != NULL; cur = cur->vnext()){
2097
+ VarNode* mate = cur->getVar();
2098
+ bool follow = false;
2099
+ switch (direction) {
2100
+ // edges in M_l are directed from values to variables
2101
+ case LBC: {
2102
+ follow = cur->template matched<direction>();
2103
+ break;
2104
+ }
2105
+ case UBC: {
2106
+ follow = !cur->template matched<direction>();
2107
+ break;
2108
+ default: GECODE_NEVER;
2109
+ }
2110
+ }
2111
+ if (follow) {
2112
+ // mark the edge
2113
+ cur->template use<direction>();
2114
+ if (!visited[mate->get_info()]) {
2115
+ ns.push(mate);
2116
+ visited[mate->get_info()] = true;
2117
+ }
2118
+ }
2119
+ }
2120
+ } else {
2121
+ // VarNode
2122
+ VarNode* vrn = static_cast<VarNode*>(node);
2123
+ switch (direction) {
2124
+ // after LBC-matching we can follow every unmatched edge
2125
+ case LBC: {
2126
+ for (Edge* cur = vrn->first(); cur != NULL; cur = cur->next()){
2127
+ ValNode* mate = cur->getVal();
2128
+ if (!cur->template matched<LBC>()) {
2129
+ cur->template use<LBC>();
2130
+ if (!visited[mate->get_info()]) {
2131
+ ns.push(mate);
2132
+ visited[mate->get_info()] = true;
2133
+ }
2134
+ }
2135
+ }
2136
+ break;
2137
+ }
2138
+ // after ub-matching we can only follow a matched edge
2139
+ case UBC: {
2140
+ Edge* cur = vrn->template get_match<UBC>();
2141
+ if (cur != NULL) {
2142
+ cur->template use<UBC>();
2143
+ ValNode* mate = cur->getVal();
2144
+ if (!visited[mate->get_info()]) {
2145
+ ns.push(mate);
2146
+ visited[mate->get_info()] = true;
2147
+ }
2148
+ }
2149
+ break;
2150
+ }
2151
+ default: GECODE_NEVER;
2152
+ }
2153
+ }
2154
+ }
2155
+ }
2156
+
2157
+ template <class View, class Card, bool isView> template <BC direction>
2158
+ inline void
2159
+ VarValGraph<View, Card, isView>::dfs(VVGNode* v,
2160
+ bool inscc[],
2161
+ bool in_unfinished[],
2162
+ int dfsnum[],
2163
+ Support::StaticStack<VVGNode*>& roots,
2164
+ Support::StaticStack<VVGNode*>& unfinished,
2165
+ int& count){
2166
+ count++;
2167
+ int v_index = v->get_info();
2168
+ dfsnum[v_index] = count;
2169
+ inscc[v_index] = true;
2170
+ in_unfinished[v_index] = true;
2171
+
2172
+ unfinished.push(v);
2173
+ roots.push(v);
2174
+ for (Edge* e = v->first(); e != NULL; e = e->next(v->get_type())) {
2175
+ bool condition = false;
2176
+ // LBC-matching
2177
+ if (direction == LBC) {
2178
+ // ValNode
2179
+ if (v->get_type()) {
2180
+ condition = e->template matched<LBC>();
2181
+ } else {
2182
+ condition = !e->template matched<LBC>();
2183
+ }
2184
+ // UBC - matching
2185
+ } else {
2186
+ if (v->get_type()) {
2187
+ // in an upper bound matching a valnode only can follow unmatched edges
2188
+ condition = !e->template matched<UBC>();
2189
+ } else {
2190
+ condition = e->template matched<UBC>();
2191
+ }
2192
+ }
2193
+ if (condition) {
2194
+ VVGNode* w = e->getMate(v->get_type());
2195
+ int w_index = w->get_info();
2196
+
2197
+ assert(w_index < node_size);
2198
+ if (!inscc[w_index]) {
2199
+ // w is an uncompleted scc
2200
+ w->inedge(e);
2201
+ dfs<direction>(w, inscc, in_unfinished, dfsnum,
2202
+ roots, unfinished, count);
2203
+ } else {
2204
+ if (in_unfinished[w_index]) {
2205
+ // even alternating cycle found mark the edge closing the cycle,
2206
+ // completing the scc
2207
+ e->template use<direction>();
2208
+ // if w belongs to an scc we detected earlier
2209
+ // merge components
2210
+ assert(roots.top()->get_info() < node_size);
2211
+ while (dfsnum[roots.top()->get_info()] > dfsnum[w_index]) {
2212
+ roots.pop();
2213
+ }
2214
+ }
2215
+ }
2216
+ }
2217
+ }
2218
+
2219
+ if (v == roots.top()) {
2220
+ while (v != unfinished.top()) {
2221
+ // w belongs to the scc with root v
2222
+ VVGNode* w = unfinished.top();
2223
+ Edge* ie = w->inedge();
2224
+ ie->template use<direction>();
2225
+ in_unfinished[w->get_info()] = false;
2226
+ unfinished.pop();
2227
+ }
2228
+ assert(v == unfinished.top());
2229
+ in_unfinished[v_index] = false;
2230
+ roots.pop();
2231
+ unfinished.pop();
2232
+ }
2233
+ }
2234
+
2235
+ template <class View, class Card, bool isView> template <BC direction>
2236
+ inline void
2237
+ VarValGraph<View, Card, isView>::strongly_connected_components(void){
2238
+ GECODE_AUTOARRAY(bool, inscc, node_size);
2239
+ GECODE_AUTOARRAY(bool, in_unfinished, node_size);
2240
+ GECODE_AUTOARRAY(int, dfsnum, node_size);
2241
+
2242
+ for (int i = node_size; i--; ) {
2243
+ inscc[i] = false;
2244
+ in_unfinished[i] = false;
2245
+ dfsnum[i] = 0;
2246
+ }
2247
+
2248
+ int count = 0;
2249
+ Support::StaticStack<VVGNode*> roots(node_size);
2250
+ Support::StaticStack<VVGNode*> unfinished(node_size);
2251
+
2252
+ for (int i = n_var; i--; ) {
2253
+ dfs<direction>(vars[i], inscc, in_unfinished, dfsnum,
2254
+ roots, unfinished, count);
2255
+ }
2256
+ }
2257
+
2258
+
2259
+ template <class View, class Card, bool isView>
2260
+ void
2261
+ VarValGraph<View, Card, isView>::print_match(void) {
2262
+ print_matching<UBC>();
2263
+ print_matching<LBC>();
2264
+ }
2265
+
2266
+
2267
+ template <class View, class Card, bool isView>
2268
+ void
2269
+ VarValGraph<View, Card, isView>::print_edges(void) {
2270
+ for (int i = 0; i < n_var; i++) {
2271
+ std::cout << vars[i]->var<<": ";
2272
+ for (Edge* e = vars[i]->first(); e != NULL; e = e->next()) {
2273
+ bool ml = e->template matched<LBC>();
2274
+ bool ul = e->template used<LBC>();
2275
+ bool mu = e->template matched<UBC>();
2276
+ bool uu = e->template used<UBC>();
2277
+ bool condition = (ml || ul || mu || uu);
2278
+ if (ml) {
2279
+ std::cout << e->getVal()->val<<" mL, ";
2280
+ }
2281
+ if (ul) {
2282
+ std::cout << e->getVal()->val<<" uL, ";
2283
+ }
2284
+ if (mu) {
2285
+ std::cout << e->getVal()->val<<" mU, ";
2286
+ }
2287
+ if (uu) {
2288
+ std::cout << e->getVal()->val<<" uU, ";
2289
+ }
2290
+ if (!condition) {
2291
+ std::cout << e->getVal()->val<<" x ";
2292
+ }
2293
+ }
2294
+ std::cout <<"\n";
2295
+ }
2296
+ std::cout <<"\n";
2297
+ }
2298
+
2299
+ // for debugging purposes
2300
+ template <class View, class Card, bool isView> template <BC direction>
2301
+ void
2302
+ VarValGraph<View, Card, isView>::print_matching(void) {
2303
+ if (direction == UBC) {
2304
+ std::cout << "UBM - check:\n";
2305
+ } else {
2306
+ std::cout << "LBM - check:\n";
2307
+ }
2308
+
2309
+ for (int i = 0; i < n_var; i++ ){
2310
+ std::cout << vars[i]->var <<" ";
2311
+ if (vars[i]->template matched<direction>()) {
2312
+ if (vars[i]->template get_match<direction>() == NULL) {
2313
+ std::cout << "N ";
2314
+ } else {
2315
+ std::cout << vars[i]->template get_match<direction>() << " ";
2316
+ std::cout << vars[i]->template get_match<direction>()->getVal()->val << " ";
2317
+ }
2318
+ }
2319
+ std::cout << " <==" << vars[i] <<"\n";
2320
+ }
2321
+ std::cout <<"\n";
2322
+
2323
+ for (int i = 0; i < n_val; i++ ){
2324
+ if (vals[i]->template matched<direction>()) {
2325
+ std::cout << "X ";
2326
+ } else {
2327
+ std::cout << "- ";
2328
+ }
2329
+ std::cout << vals[i]->template cap<direction>() << " ";
2330
+ std::cout << vals[i]->get_maxlow() << " ";
2331
+ std::cout << vals[i]->val << " <==";
2332
+ for (Edge* e = vals[i]->first(); e != NULL; e = e->vnext()) {
2333
+ if (e->template matched<direction>()) {
2334
+ std::cout << e->getVar()->var << ",";
2335
+ }
2336
+ }
2337
+ std::cout <<"\n";
2338
+ }
2339
+ std::cout <<"\n";
2340
+ }
2341
+
2342
+ template <class View, class Card, bool isView>
2343
+ void
2344
+ VarValGraph<View, Card, isView>::print_graph(void) {
2345
+ std::cout << "Graph-size = "<<node_size<<" ";
2346
+ std::cout << "sum_min ="<<sum_min << " & "
2347
+ << "sum_max ="<<sum_max << "\n";
2348
+ std::cout << "X-Partition: \n";
2349
+ for (int i = 0; i < n_var; i++) {
2350
+ VarNode* vrn = vars[i];
2351
+ std::cout << "X("<<vars[i]->get_info()<<") ";
2352
+ std::cout << "["<<vrn->xindex <<"]";
2353
+ std::cout << "|"<<vrn->noe <<"|";
2354
+ std::cout << "{";
2355
+ for (Edge* e = vrn->first(); e != NULL; e = e->next()){
2356
+ assert(e != NULL);
2357
+ assert(e->getVal() != NULL);
2358
+ std::cout << e->getVal()->val<<",";
2359
+ }
2360
+ std::cout <<"}\t";
2361
+ std::cout << "F"<<vrn->first() << ", L" << vrn->last() << " ";
2362
+ std::cout <<"\n";
2363
+ }
2364
+ std::cout <<"\n";
2365
+
2366
+ std::cout << "V-Partition: \n";
2367
+ for (int i = 0; i < n_val; i++) {
2368
+ ValNode* vln = vals[i];
2369
+ std::cout << vln->val <<" ";
2370
+ std::cout << "V(" << i << ") ";
2371
+ std::cout << "k(" << vln->kmin() << "," <<vln->kmax() << ") ";
2372
+ std::cout << "c(" << vln->template cap<LBC>() << ","
2373
+ << vln->template cap<UBC>() << ") ";
2374
+ std::cout << "ublow: "<<vln->get_maxlow() <<" ";
2375
+ std::cout << "|"<<vln->noe <<"|";
2376
+ std::cout << "{";
2377
+ if (vln->noe == 0 || vln->first() == NULL) {
2378
+ std::cout << "EMPTY";
2379
+ } else {
2380
+ for(Edge* c = vln->first(); c != NULL; c = c->vnext()){
2381
+ assert(c != NULL);
2382
+ assert(c->getVar() != NULL);
2383
+ std::cout << c->getVar()->var << ",";
2384
+ }
2385
+ }
2386
+ std::cout <<"}\t";
2387
+ std::cout <<"\t";
2388
+ if (vln->noe == 0 || vln->first() == NULL) {
2389
+ std::cout <<"no-ptr";
2390
+ } else {
2391
+ std::cout << "F"<<vln->first() << ", L" <<vln->last() << " ";
2392
+ }
2393
+ std::cout <<"\n";
2394
+ }
2395
+ std::cout <<"\n";
2396
+ }
2397
+
2398
+
2399
+ template <class View, class Card, bool isView>
2400
+ forceinline
2401
+ VarValGraph<View, Card, isView>::~VarValGraph(void){
2402
+ Memory::free(mem);
2403
+ }
2404
+
2405
+ template <class View, class Card, bool isView>
2406
+ forceinline void*
2407
+ VarValGraph<View, Card, isView>::operator new(size_t t){
2408
+ return Memory::malloc(t);
2409
+ }
2410
+
2411
+ template <class View, class Card, bool isView>
2412
+ forceinline void
2413
+ VarValGraph<View, Card, isView>::operator delete(void* p){
2414
+ Memory::free(p);
2415
+ }
2416
+
2417
+
2418
+ }}}
2419
+
2420
+ // STATISTICS: int-prop
2421
+
2422
+