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