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